@@ -517,32 +517,6 @@ create or replace package body ut_suite_builder is
517517 a_suite_items( a_suite_items.last ) := l_test;
518518 end;
519519
520- procedure propagate_before_after_each(
521- a_suite in out nocopy ut_logical_suite,
522- a_before_each_list tt_executables,
523- a_after_each_list tt_executables
524- ) is
525- l_test ut_test;
526- l_context ut_logical_suite;
527- begin
528- if a_suite.items is not null then
529- for i in 1 .. a_suite.items.count loop
530- if a_suite.items(i) is of (ut_test) then
531- l_test := treat( a_suite.items(i) as ut_test);
532- l_test.before_each_list := convert_list(a_before_each_list) multiset union all l_test.before_each_list;
533- set_seq_no(l_test.before_each_list);
534- l_test.after_each_list := l_test.after_each_list multiset union all convert_list(a_after_each_list);
535- set_seq_no(l_test.after_each_list);
536- a_suite.items(i) := l_test;
537- elsif a_suite.items(i) is of (ut_logical_suite) then
538- l_context := treat(a_suite.items(i) as ut_logical_suite);
539- propagate_before_after_each( l_context, a_before_each_list, a_after_each_list);
540- a_suite.items(i) := l_context;
541- end if;
542- end loop;
543- end if;
544- end;
545-
546520 procedure propagate_before_after_each(
547521 a_suite_items in out nocopy ut_suite_items,
548522 a_before_each_list tt_executables,
@@ -929,113 +903,110 @@ create or replace package body ut_suite_builder is
929903 a_suite_data_cursor sys_refcursor
930904 ) is
931905 type t_item_levels is table of ut_suite_items index by binary_integer;
906+ c_bulk_limit constant pls_integer := 1000;
932907 l_items_at_level t_item_levels;
933908 l_rows tt_cached_suites;
934- l_tests ut_suite_items := ut_suite_items() ;
935- l_logical_suites ut_logical_suites := ut_logical_suites() ;
909+ l_test ut_test ;
910+ l_logical_suite ut_logical_suite ;
936911 l_level pls_integer;
937912 l_prev_level pls_integer;
938913 l_idx integer;
939914 begin
940915 a_suites := ut_suite_items();
941916 loop
942- if l_idx is null then
943- fetch a_suite_data_cursor bulk collect into l_rows limit 1000;
944- l_tests.delete;
945- l_tests.extend(l_rows.count);
946- l_logical_suites.delete;
947- l_logical_suites.extend(l_rows.count);
948- for i in 1 .. l_rows.count loop
949- case l_rows(i).self_type
950- when 'UT_TEST' then
951- l_tests(i) :=
952- ut_test(
953- self_type => l_rows(i).self_type,
954- object_owner => l_rows(i).object_owner, object_name => lower(l_rows(i).object_name),
955- name => lower(l_rows(i).name), description => l_rows(i).description, path => l_rows(i).path,
956- rollback_type => l_rows(i).rollback_type, disabled_flag => l_rows(i).disabled_flag,
957- line_no => l_rows(i).line_no, parse_time => l_rows(i).parse_time,
958- start_time => null, end_time => null, result => null, warnings => l_rows(i).warnings,
959- results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
960- before_each_list => sort_by_seq_no(l_rows(i).before_each_list), before_test_list => sort_by_seq_no(l_rows(i).before_test_list),
961- item => l_rows(i).item,
962- after_test_list => sort_by_seq_no(l_rows(i).after_test_list), after_each_list => sort_by_seq_no(l_rows(i).after_each_list),
963- all_expectations => ut_expectation_results(), failed_expectations => ut_expectation_results(),
964- parent_error_stack_trace => null, expected_error_codes => l_rows(i).expected_error_codes
965- );
966- when 'UT_SUITE' then
967- l_logical_suites(i) :=
968- ut_suite(
969- self_type => l_rows(i).self_type,
970- object_owner => l_rows(i).object_owner, object_name => lower(l_rows(i).object_name),
971- name => lower(l_rows(i).name), description => l_rows(i).description, path => l_rows(i).path,
972- rollback_type => l_rows(i).rollback_type, disabled_flag => l_rows(i).disabled_flag,
973- line_no => l_rows(i).line_no, parse_time => l_rows(i).parse_time,
974- start_time => null, end_time => null, result => null, warnings => l_rows(i).warnings,
975- results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
976- items => ut_suite_items(),
977- before_all_list => sort_by_seq_no(l_rows(i).before_all_list), after_all_list => sort_by_seq_no(l_rows(i).after_all_list)
978- );
979- when 'UT_SUITE_CONTEXT' then
980- l_logical_suites(i) :=
981- ut_suite_context(
982- self_type => l_rows(i).self_type,
983- object_owner => l_rows(i).object_owner, object_name => lower(l_rows(i).object_name),
984- name => lower(l_rows(i).name), description => l_rows(i).description, path => l_rows(i).path,
985- rollback_type => l_rows(i).rollback_type, disabled_flag => l_rows(i).disabled_flag,
986- line_no => l_rows(i).line_no, parse_time => l_rows(i).parse_time,
987- start_time => null, end_time => null, result => null, warnings => l_rows(i).warnings,
988- results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
989- items => ut_suite_items(),
990- before_all_list => sort_by_seq_no(l_rows(i).before_all_list), after_all_list => sort_by_seq_no(l_rows(i).after_all_list)
991- );
992- when 'UT_LOGICAL_SUITE' then
993- l_logical_suites(i) :=
994- ut_logical_suite(
995- self_type => l_rows(i).self_type,
996- object_owner => l_rows(i).object_owner, object_name => lower(l_rows(i).object_name),
997- name => lower(l_rows(i).name), description => l_rows(i).description, path => l_rows(i).path,
998- rollback_type => l_rows(i).rollback_type, disabled_flag => l_rows(i).disabled_flag,
999- line_no => l_rows(i).line_no, parse_time => l_rows(i).parse_time,
1000- start_time => null, end_time => null, result => null, warnings => l_rows(i).warnings,
1001- results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
1002- items => ut_suite_items()
1003- );
1004- end case;
1005- end loop;
1006- l_idx := l_rows.first;
1007- end if;
1008- exit when l_idx is null;
1009- l_level := length(l_rows(l_idx).path) - length( replace(l_rows(l_idx).path, '.') ) + 1;
917+ fetch a_suite_data_cursor bulk collect into l_rows limit c_bulk_limit;
918+ exit when l_rows.count = 0;
1010919
1011- if l_level > 1 then
1012- if l_prev_level > l_level then
1013- l_logical_suites(l_idx).items := l_items_at_level(l_prev_level);
1014- l_items_at_level(l_prev_level).delete;
1015- end if;
1016- if not l_items_at_level.exists(l_level) then
1017- l_items_at_level(l_level) := ut_suite_items();
1018- end if;
1019- l_items_at_level(l_level).extend;
1020- if l_tests(l_idx) is not null then
1021- l_items_at_level(l_level)(l_items_at_level(l_level).last) := l_tests(l_idx);
1022- else
1023- l_items_at_level(l_level)(l_items_at_level(l_level).last) := l_logical_suites(l_idx);
1024- end if;
1025- else
1026- if l_prev_level > l_level then
1027- l_logical_suites(l_idx).items := l_items_at_level(l_prev_level);
1028- l_items_at_level(l_prev_level).delete;
1029- end if;
1030- a_suites.extend;
1031- if l_tests(l_idx) is not null then
1032- a_suites(a_suites.last) := l_tests(l_idx);
920+ l_idx := l_rows.first;
921+ loop
922+ l_test := null;
923+ l_logical_suite := null;
924+ case l_rows(l_idx).self_type
925+ when 'UT_TEST' then
926+ l_test :=
927+ ut_test(
928+ self_type => l_rows(l_idx).self_type,
929+ object_owner => l_rows(l_idx).object_owner, object_name => lower(l_rows(l_idx).object_name),
930+ name => lower(l_rows(l_idx).name), description => l_rows(l_idx).description, path => l_rows(l_idx).path,
931+ rollback_type => l_rows(l_idx).rollback_type, disabled_flag => l_rows(l_idx).disabled_flag,
932+ line_no => l_rows(l_idx).line_no, parse_time => l_rows(l_idx).parse_time,
933+ start_time => null, end_time => null, result => null, warnings => l_rows(l_idx).warnings,
934+ results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
935+ before_each_list => sort_by_seq_no(l_rows(l_idx).before_each_list), before_test_list => sort_by_seq_no(l_rows(l_idx).before_test_list),
936+ item => l_rows(l_idx).item,
937+ after_test_list => sort_by_seq_no(l_rows(l_idx).after_test_list), after_each_list => sort_by_seq_no(l_rows(l_idx).after_each_list),
938+ all_expectations => ut_expectation_results(), failed_expectations => ut_expectation_results(),
939+ parent_error_stack_trace => null, expected_error_codes => l_rows(l_idx).expected_error_codes
940+ );
941+ when 'UT_SUITE' then
942+ l_logical_suite :=
943+ ut_suite(
944+ self_type => l_rows(l_idx).self_type,
945+ object_owner => l_rows(l_idx).object_owner, object_name => lower(l_rows(l_idx).object_name),
946+ name => lower(l_rows(l_idx).name), description => l_rows(l_idx).description, path => l_rows(l_idx).path,
947+ rollback_type => l_rows(l_idx).rollback_type, disabled_flag => l_rows(l_idx).disabled_flag,
948+ line_no => l_rows(l_idx).line_no, parse_time => l_rows(l_idx).parse_time,
949+ start_time => null, end_time => null, result => null, warnings => l_rows(l_idx).warnings,
950+ results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
951+ items => ut_suite_items(),
952+ before_all_list => sort_by_seq_no(l_rows(l_idx).before_all_list), after_all_list => sort_by_seq_no(l_rows(l_idx).after_all_list)
953+ );
954+ when 'UT_SUITE_CONTEXT' then
955+ l_logical_suite :=
956+ ut_suite_context(
957+ self_type => l_rows(l_idx).self_type,
958+ object_owner => l_rows(l_idx).object_owner, object_name => lower(l_rows(l_idx).object_name),
959+ name => lower(l_rows(l_idx).name), description => l_rows(l_idx).description, path => l_rows(l_idx).path,
960+ rollback_type => l_rows(l_idx).rollback_type, disabled_flag => l_rows(l_idx).disabled_flag,
961+ line_no => l_rows(l_idx).line_no, parse_time => l_rows(l_idx).parse_time,
962+ start_time => null, end_time => null, result => null, warnings => l_rows(l_idx).warnings,
963+ results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
964+ items => ut_suite_items(),
965+ before_all_list => sort_by_seq_no(l_rows(l_idx).before_all_list), after_all_list => sort_by_seq_no(l_rows(l_idx).after_all_list)
966+ );
967+ when 'UT_LOGICAL_SUITE' then
968+ l_logical_suite :=
969+ ut_logical_suite(
970+ self_type => l_rows(l_idx).self_type,
971+ object_owner => l_rows(l_idx).object_owner, object_name => lower(l_rows(l_idx).object_name),
972+ name => lower(l_rows(l_idx).name), description => l_rows(l_idx).description, path => l_rows(l_idx).path,
973+ rollback_type => l_rows(l_idx).rollback_type, disabled_flag => l_rows(l_idx).disabled_flag,
974+ line_no => l_rows(l_idx).line_no, parse_time => l_rows(l_idx).parse_time,
975+ start_time => null, end_time => null, result => null, warnings => l_rows(l_idx).warnings,
976+ results_count => ut_results_counter(), transaction_invalidators => ut_varchar2_list(),
977+ items => ut_suite_items()
978+ );
979+ end case;
980+
981+ l_level := length(l_rows(l_idx).path) - length( replace(l_rows(l_idx).path, '.') ) + 1;
982+
983+ if l_level > 1 then
984+ if l_prev_level > l_level then
985+ l_logical_suite.items := l_items_at_level(l_prev_level);
986+ l_items_at_level(l_prev_level).delete;
987+ end if;
988+ if not l_items_at_level.exists(l_level) then
989+ l_items_at_level(l_level) := ut_suite_items();
990+ end if;
991+ l_items_at_level(l_level).extend;
992+ if l_test is not null then
993+ l_items_at_level(l_level)(l_items_at_level(l_level).last) := l_test;
994+ else
995+ l_items_at_level(l_level)(l_items_at_level(l_level).last) := l_logical_suite;
996+ end if;
1033997 else
1034- a_suites(a_suites.last) := l_logical_suites(l_idx);
998+ if l_prev_level > l_level then
999+ l_logical_suite.items := l_items_at_level(l_prev_level);
1000+ l_items_at_level(l_prev_level).delete;
1001+ end if;
1002+ a_suites.extend;
1003+ a_suites(a_suites.last) := l_logical_suite;
10351004 end if;
1036- end if;
1037- l_prev_level := l_level;
1038- l_idx := l_rows.next(l_idx);
1005+ l_prev_level := l_level;
1006+ l_idx := l_rows.next(l_idx);
1007+ exit when l_idx is null;
1008+ end loop;
1009+ exit when l_rows.count < c_bulk_limit;
10391010 end loop;
10401011 copy_list_reverse_order( a_suites );
10411012 close a_suite_data_cursor;
@@ -1066,7 +1037,7 @@ create or replace package body ut_suite_builder is
10661037 open l_result for
10671038 q'[with
10681039 suite_items as (
1069- select c.*
1040+ select /*+ cardinality(c 100) */ c.*
10701041 from ]'||l_ut_owner||q'[.ut_suite_cache c
10711042 where 1 = 1 ]'||case when not a_skip_all_objects then q'[
10721043 and exists
@@ -1093,7 +1064,7 @@ create or replace package body ut_suite_builder is
10931064 ),
10941065 gen as (
10951066 select rownum as pos
1096- from xmltable('1 to 100 ')
1067+ from xmltable('1 to 20 ')
10971068 ),
10981069 suitepaths as (
10991070 select distinct substr(path,1,instr(path,'.',-1)-1) as suitepath,
0 commit comments