Диссертация (1091077), страница 14
Текст из файла (страница 14)
«Начитка». Начитываются вторичные записи в массив ARR_Temp. Приэтом учитываются результаты выполнения п. 1 и п. 2, благодаря которымнекоторые из элементов могут быть обработаны так, что не нужно будетобращаться в другой ОЦВК, чтобы их там обработать, поскольку,например, произведенных проверок (п. 1) и полученных данных (п. 2) повторичным записям вполне достаточно для данной выборки;4. «Обработкаудаленная».СоздаетсямассивARR1_AC,элементыкоторого являются массивами, состоящими из элементов массиваARR_Temp (п. 3), у которых одинаковый AC. Элементы ARR1_ACпараллельно отправляются в соответствующие ОЦВК для удаленнойобработки.ПослеобработкикаждогоэлементаARR1_AC[i]изARR1_AC выполняется алгоритм «Отказ в доступе»:1) начитываются в массив ARR_TMP элементы из обработанногомассива ARR1_AC[i], которые в другом ОЦВК не удалось обработатьиз-за технического сбоя;2) ARR_TMP повторно отправляется в соответствующий ОЦВК наобработку;823) обновляются элементы из массива ARR1_AC[i] на удачно повторнообработанные элементы из ARR_TMP;4) описанные выше действия повторяются до тех пор, пока существуютэлементы в ARR_TMP и пока не превышен лимит повторений RT дляданной функциональности.
После всей обработки п. 4 массивARR1_AC снова преобразуется в структуру массива ARR_Temp.5. «Обновление».Обновляютсяэлементыосновногомассиванаобработанные элементы массива ARR_Temp (п. 4);6. «Заполнение».ЗаполняютсяданнымивсеэлементымассивовARR_Field_Result.ПослеобработкиосновногомассиваARR1можетпотребоватьсявыполнение дополнительных действий над ним, соответствующие требованиямконкретной функциональности. Это предлагается реализовать либо программно,либо с помощью временной таблицы БД, в которую загружаются полученныеданные этого массива, чтобы выполнить с помощью SQL дополнительнуюлокальную обработку, например:• применить групповые SQL-функции (SUM, AVG, MAX и т.п.);• сортировать данные;• выполнить сложную фильтрацию данных, например, включающуюпроверку данных сразу в нескольких таблицах.Обработанный основной массив может быть конечным результатомвыборки для данной функциональности, а может быть использован для обработкидругого основного массива ARR1, к которому также необходимо применитьалгоритм «Поиск данных», поскольку функциональность может состоять изнескольких основных массивов.Примечания:• «этот же ОЦВК» – ОЦВК, в котором выполняется в данный моментобработка;• важно: в Table вместо таблиц интегрального отношения с окончанием «22»или «33», всегда указываются, соответственно, таблицы интегрального83отношения с окончанием «2» или «3».
Если Table с окончанием «2» или «3»,а в AC указан этот же ОЦВК, то обработка в БД ведется по этим же таблицам,иначе по соответствующим таблицам, но с окончанием «22» или «33»;• используемый элемент из ARR_Rule (всего два: первый элемент – это длявсех таблиц, исключая таблицы интегрального отношения с окончанием «22»или «33», а второй – для таблиц интегрального отношения с окончанием «22»или «33») для таблиц интегрального отношения определяется по следующемупринципу: если ОЦВК, указанный в AC, совпадает с этим же ОЦВК, тоиспользуется первый элемент из ARR_Rule, иначе – второй;• Элементы с ST=1 обрабатываются в первую очередь;• Для таблиц Table интегрального отношения в ARR1 с окончанием «2» или«3» в качестве AC и Id_real указываются значения из соответствующейзаписи таблицы интегрального отношения с окончанием «1».Расшифровка используемых обозначений:• «Свой AC» и «Чужой AC» – это для обозначения ОЦВК, в котором,соответственно, выполняется и не выполняется в данный момент обработка;• «∃a ∈ A» – это означает, что существует (∃) элемент а в множестве A;• «length(ARR1)» – количество элементов массива ARR1;•«Добавляем ARR_Data[j] в ARR_Temp» – массив ARR_Temp имеетаналогичную структуру массива ARR1, поэтому в ARR_Temp добавляется нетолько ARR_Data[j] ∈ ARR_Data из ARR1[i], но и соответствующаяструктура из ARR1[i];• «ARR_Main1(ARR1[i])» – это означает, что по значениям Step, Table,Key_Field из элемента ARR1[i] определяется соответствующий элемент вARR_Main1;• «ARR_Data1[j] ⊂ ARR_Temp» – ARR_Data1[j] содержится в ARR_Temp;•«в ARR_Data1[j] есть неопределенность» – это означает, что в ARR_Data1[j]имеются не обработанные (или не полностью обработанные) массивыARR_Cond_Result, ARR_Field_Result или ARR1;84•«{Id/Id_real}» – это равно: Id, если в AC указан этот же ОЦВК и таблица Table не является таблицейинтегрального отношения; Id, если в AC указан другой ОЦВК и таблица Table является интегральнойтаблицей с окончанием «2» или «3»; Id, если в AC указан другой ОЦВК и таблица Table является интегральнойтаблицей с окончанием «1»; Id_real, если в AC указан этот же ОЦВК и таблица Table являетсяинтегральной таблицей с окончанием «1»; если в AC указан этот же ОЦВК и таблица Table с окончанием «2» или«3», то по Id_real определяется запись в таблице интегрального отношенияс окончанием «1», по которой определяется соответствующий искомый Idзаписи из таблицы Table, используя DT.• «Rec» – реальная запись в БД ОЦВК, в котором выполняется обработкаэлемента массива, соответствующего этой записи.
При этом поиск записи вБД выполняется по {Id/Id_real};• «ARR2[t], созданный на основе ARR_Main2[t]» – элемент ARR2[t] ∈ ARR2созданнаосновесоответствующихзначенийэлементаARR_Main2[t] ∈ ARR_Main2;• «RT» – количество повторных обращений к другой ОЦВК, если былтехнический сбой в ней. RT определяется для каждой функциональности,исходя из значимости и необходимой скорости обработки массива выборки;• «Формируем массив ARR_Data2, дополняя его X-элементами» – частьX-элементов может быть получена с помощью вторичных записей в одномОЦВК, а часть X-элементов – с помощью первичных записей в другомОЦВК.
При этом схожие X-элементы по Id_real и AC не добавляются вARR_Data2.85началоВходные параметры:* массив ARR1;* RT1)Выполняем алгоритм «Ограничение»:ВХОД: ARR1ВЫХОД: ARR12)Выполняем алгоритм «Заполнение»:ВХОД: TAB := 1; ARR1ВЫХОД: ARR1ARR_Temp := ∅3)Выполняем алгоритм «Начитка»:ВХОД: ARR1; ARR_TempВЫХОД: ARR_TempARR_Temp = ∅ДаНет4)Выполняем алгоритм «Обработка удаленная»:ВХОД: ARR_Temp; RTВЫХОД: ARR_Temp5)Выполняем алгоритм «Обновление»:ВХОД: ARR1; ARR_TempВЫХОД: ARR16)Выполняем алгоритм «Заполнение»:ВХОД: TAB := 2; ARR1ВЫХОД: ARR1Выходные параметры:* массив ARR1конецРисунок 3.10 – Алгоритм «Обработка локальная» для поиска данных86началоВходные параметры:* массив ARR1N := length(ARR1); i := -1; ARR_Temp1 := ∅N>0НетДа3i := i + 14N2 := length(ARR_Data1); j := -1/*ARR_Data1∈ARR1[i]*/N2 > 0НетДа5j := j + 16N3 := length(ARR_Temp1); r := -1НетN3 > 0Да7r := r + 18Step1 = Step2 и Table1 = Table2 и Key_Field1 = Key_Field2/*Table1, Step1, Key_Field1 ∈ ARR1[i];Table2, Step2, Key_Field2 ∈ ARR_Temp1[r]*/ДаN4 := length(ARR_Data1); k := -1/*ARR_Data1 ∈ ARR_Temp1[r]*/N4 > 0НетДаk := k + 1ДаId_real1 = Id_real2 и AC1 = AC2/*Id_real1, AC1 ∈ ARR_Data1[j];Id_real2, AC2 ∈ ARR_Data1[k]*/ARR_Data1[j] := ARR_Data1[k]Нетk < N4ДаНет91Рисунок 3.11 – Алгоритм «Ограничение» для поиска данныхНет87718Даr < N3НетНет∃Rec и ∃ARR_Cond ∈ ARR_Main1(ARR1[i])ДаОпределяем ARR_Cond_Result и DL на основе ARR_Cond, ARR_Rule по {Id/Id_real} и AC/*ARR_Cond_Result, DL, Id, Id_real, AC ∈ ARR_Data1[j]; ARR_Cond, ARR_Rule ∈ ARR_Main_1(ARR1[i])*/DL = 1Да/*DL ∈ ARR_Data1[j]*/НетНет∃Rec и ∃ARR_Main2 ∈ ARR_Main1(ARR1[i])ДаN2 := length(ARR_Main2); t := -110/*ARR_Main2 ∈ ARR_Main1(ARR1[i])*/t := t + 111∃ARR2[t], созданный на основеARR_Main2[t], в ARR_Data1[j]ДаНетСоздаем ARR2[t] в ARR_Data1[j], используя Step, Table, Key_Field, DT, ST ∈ ARR_Main2[t]НетLK = 1Да/*LK ∈ ARR_Main2[t]*/Формируем массив ARR_Data2, дополняя егоX-элементом, заполняя в них Id, Id_real и ACна основе {Id/Id_real} и Key_FieldФормируем массив ARR_Data2, дополняя егоX-элементами, заполняя в них Id, Id_real и ACна основе {Id/Id_real}, DT и Key_Field/*Key_Field ∈ ARR2[t]; ARR_Data2 ∈ ARR2[t]; X – x-запись вБД, на которую ссылается запись с {Id/Id_real} ∈ ARR_Data1[j]*//*DT, Key_Field ∈ ARR2[t]; X – x-запись в БД, в которой естьссылка на {Id/Id_real}∈ARR_Data1[j]; ARR_Data2∈ARR2[t]*/Выполняем алгоритм «Ограничение»:ВХОД: ARR2[t]ВЫХОД: ARR2[t]ST = 3/*ST ∈ ARR2[t]*/ДаDL:= 1/*DL ∈ ARR_Data1[j]*/2Продолжение рисунка 3.11Нет881121069t < N2 и DL ≠ 1Да/*DL ∈ ARR_Data1[j]*/НетDL := 1НетДобавляемARR_Data1[j] вARR_Temp1/*DL ∈ ARR_Data1[j]*/DL = 1/*DL ∈ ARR_Data1[j]*/ДаУдаляем ARR_Cond_Result,ARR_Field_Result, ARR2 ∈ ARR_Data1[j]НетДаДобавляем ARR_Data1[j] в ARR_Temp1Step = 1Нет/*Step ∈ ARR1[i]*/ДаУдаляем ARR_Data1[j]j < N1ДаНет5ARR_Data1 = ∅ или все DL = 1/*DL ∈ ARR_Data1*/НетДаУдаляем ARR_Data1 ∈ ARR1[i]НетДаST = 1/*ST ∈ ARR1[i]*/ST := 2ST := 3/*ST ∈ ARR1[i]*//*ST ∈ ARR1[i]*/НетStep = 1 и (ST = 2 или ST = 3)/*Step, ST ∈ ARR1[i] */ДаУдаляем ARR1[i]3i<N4ДаНетВыходные параметры:* массив ARR1конецОкончание рисунка 3.1189началоВходные параметры:* массивы: ARR1, ARR_TempN := length(ARR1); i := -1НетN>0Даi := i + 1N1 := length(ARR_Data1); j := -1/*ARR_Data1 ∈ ARR1[i]*/НетN1 > 0 и ST ≠ 2 и ST ≠ 3/*ST ∈ ARR1[i]*/Даj := j + 1ДаDL = 1/*DL ∈ ARR_Data1[j]*/НетЧужой AC и в ARR_Data1[j] есть неопределенность/*AC ∈ ARR_Data1[j]*/ДаДаARR_Data1[j] ⊂ ARR_TempНетДобавляем ARR_Data1[j] в ARR_TempНет∃ARR2 ∈ ARR_Data1[j]ДаN2 := length(ARR2); t := -1НетN2 > 0Даt := t + 1Выполняем алгоритм «Начитка»:ВХОД: ARR2[t]; ARR_TempВЫХОД: ARR_Tempt < N2ДаНетj < N1ДаНетi<NДаНетВыходные параметры:* массив ARR_TempконецРисунок 3.12 – Алгоритм «Начитка» для поиска данныхНет90началоВходные параметры:* массив ARR1, ARR_TempN := length(ARR1); i := -1i := i + 1N2 := length(ARR_Data1); j := -1/*ARR_Data1 ∈ ARR1[i]*/N2 > 0 и ST ≠ 2 и ST ≠ 3Нет/*ST ∈ ARR1[i]*/Да4j := j + 1DL = 1Да/*DL ∈ ARR_Data1[j]*/НетЧужой AC и в ARR_Data1[j]есть неопределенностьНет/*AC ∈ ARR_Data1[j]*/ДаN3 := length(ARR_Temp), r := -1НетN3 > 0Да6r := r + 1Table1 = Table2 и Step1 = Step2 иKey_Field1 = Key_Field2Нет/*Table1, Step1, Key_Field1 ∈ ARR1[i];Table2, Step2, Key_Field2 ∈ ARR_Temp[r]*/ДаST = 2 или ST = 3/*ST ∈ ARR_Temp[r]*/Нет1ДаARR1[i] := ARR_Temp[r]498Рисунок 3.13.