DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_AW_MD_API

Source


1 package body BSC_AW_MD_API AS
2 /*$Header: BSCAWMAB.pls 120.22 2006/11/04 10:39:38 amitgupt noship $*/
3 
4 function is_dim_present(
5 p_dimension varchar2
6 )return boolean is
7 Begin
8   g_olap_object.delete;
9   get_bsc_olap_object(p_dimension,'dimension',p_dimension,'dimension',g_olap_object);
10   if g_olap_object.count>0 then
11     return true;
12   else
13     return false;
14   end if;
15 Exception when others then
16   log_n('Exception in is_dim_present '||sqlerrm);
17   raise;
18 End;
19 
20 procedure get_kpi_for_dim(
21 p_dim_name varchar2,
22 p_kpi_list out nocopy dbms_sql.varchar2_table
23 ) is
24 Begin
25   g_olap_object_relation.delete;
26   get_bsc_olap_object_relation(null,null,'dimension kpi',p_dim_name,'dimension',g_olap_object_relation);
27   for i in 1..g_olap_object_relation.count loop
28     p_kpi_list(i):=g_olap_object_relation(i).relation_object;
29   end loop;
30 Exception when others then
31   log_n('Exception in get_kpi_for_dim '||sqlerrm);
32   raise;
33 End;
34 
35 procedure mark_kpi_recreate(p_kpi varchar2) is
36 Begin
37   bsc_aw_md_wrapper.mark_kpi_recreate(p_kpi);
38 Exception when others then
39   log_n('Exception in mark_kpi_recreate '||sqlerrm);
40   raise;
41 End;
42 
43 /*
44 returns the name of the olap objects that need to be dropped from aw
45 */
46 procedure get_dim_olap_objects(
47 p_dim_name varchar2,
48 p_objects out nocopy bsc_aw_md_wrapper.bsc_olap_object_tb,
49 p_type varchar2
50 ) is
51 --
52 Begin
53   if p_type='all' then
54     get_bsc_olap_object(null,null,p_dim_name,'dimension',p_objects);
55   else
56     get_bsc_olap_object(null,p_type,p_dim_name,'dimension',p_objects);
57   end if;
58 Exception when others then
59   log_n('Exception in get_dim_olap_objects '||sqlerrm);
60   raise;
61 End;
62 
63 procedure drop_dim(p_dim_name varchar2) is
64 Begin
65   clear_all_cache;
66   bsc_aw_md_wrapper.drop_dim(p_dim_name);
67   clear_all_cache;
68 Exception when others then
69   log_n('Exception in drop_dim '||sqlerrm);
70   raise;
71 End;
72 
73 /*
74 in this api, we need to loop and search because a level might have been in a diff dim before
75 so we need to get the list of all cc dim for the levels that are now part of p_dimension
76 */
77 procedure get_ccdim_for_levels(
78 p_dimension bsc_aw_adapter_dim.dimension_r,
79 p_dim_list out nocopy dbms_sql.varchar2_table
80 ) is
81 --
82 l_dim dbms_sql.varchar2_table;
83 --
84 Begin
85   p_dim_list.delete;
86   if g_debug then
87     log_n('CCDIM for levels');
88   end if;
89   for i in 1..p_dimension.level_groups.count loop
90     for j in 1..p_dimension.level_groups(i).levels.count loop
91       l_dim.delete;
92       get_dims_for_level(p_dimension.level_groups(i).levels(j).level_name,l_dim);
93       bsc_aw_utility.merge_array(p_dim_list,l_dim);
94     end loop;
95   end loop;
96 Exception when others then
97   log_n('Exception in get_ccdim_for_levels '||sqlerrm);
98   raise;
99 End;
100 
101 /*
102 given a dim level, find the CC dim
103 note>>> this only returns the latest un-corrected dim. used in BSCAWAKB.pls, BSCAWLDB.pls
104 */
105 procedure get_dim_for_level(p_level varchar2,p_dim out nocopy varchar2) is
106 l_oo_dim bsc_aw_md_wrapper.bsc_olap_object_tb;
107 l_oo_level bsc_aw_md_wrapper.bsc_olap_object_tb;
108 Begin
109   get_bsc_olap_object(p_level,'dimension level',null,null,l_oo_level);
110   --there can multiple dim in l_oo_level. only 1 is un-corrected
111   for i in 1..l_oo_level.count loop
112     if l_oo_level(i).parent_object_type='dimension' then
113       l_oo_dim.delete;
114       get_bsc_olap_object(l_oo_level(i).parent_object,'dimension',l_oo_level(i).parent_object,'dimension',l_oo_dim);
115       if nvl(bsc_aw_utility.get_parameter_value(l_oo_dim(1).property1,'corrected',','),'N')='N' then
116         p_dim:=l_oo_dim(1).object;
117         return;
118       end if;
119     end if;
120   end loop;
121 Exception when others then
122   log_n('Exception in get_dim_for_level '||sqlerrm);
123   raise;
124 End;
125 
126 /*
127 given a dim level, find all CC dims
128 */
129 procedure get_dims_for_level(p_level varchar2,p_dim out nocopy dbms_sql.varchar2_table) is
130 l_oo_level bsc_aw_md_wrapper.bsc_olap_object_tb;
131 Begin
132   get_bsc_olap_object(p_level,'dimension level',null,null,l_oo_level);
133   --there can multiple dim in l_oo_level. only 1 is un-corrected
134   for i in 1..l_oo_level.count loop
135     if l_oo_level(i).parent_object_type='dimension' then
136       p_dim(p_dim.count+1):=l_oo_level(i).parent_object;
137     end if;
138   end loop;
139 Exception when others then
140   log_n('Exception in get_dims_for_level '||sqlerrm);
141   raise;
142 End;
143 
144 /*
145 here we convert from one format to the other, from bsc_aw_adapter_dim.dimension_r to
146 bsc_aw_md_wrapper.dimension_r
147 */
148 procedure create_dim_objects(
149 p_dimension bsc_aw_adapter_dim.dimension_r
150 ) is
151 Begin
152   bsc_aw_md_wrapper.create_dim(p_dimension);
153   clear_all_cache;
154 Exception when others then
155   log_n('Exception in create_dim_objects '||sqlerrm);
156   raise;
157 End;
158 
159 /*
160 get the position of a level. this will be used from the UI module to see the positions of the levels and see
161 if agg on the fly is reqd
162 */
163 function get_level_position(
164 p_dim_level varchar2
165 ) return number is
166 l_position number;
167 Begin
168   g_olap_object.delete;
169   get_bsc_olap_object(p_dim_level,'dimension level',null,null,g_olap_object);
170   l_position:=bsc_aw_utility.get_parameter_value(g_olap_object(1).property1,'position',',');
171   if l_position is null then
172     return null;
173   else
174     return to_number(l_position);
175   end if;
176 Exception when others then
177   log_n('Exception in get_level_position '||sqlerrm);
178   raise;
179 End;
180 
181 procedure drop_kpi(p_kpi varchar2) is
182 Begin
183   clear_all_cache;
184   bsc_aw_md_wrapper.drop_kpi(p_kpi);
185   clear_all_cache;
186 Exception when others then
187   log_n('Exception in drop_kpi '||sqlerrm);
188   raise;
189 End;
190 
191 procedure get_kpi_olap_objects(
192 p_kpi varchar2,
193 p_objects out nocopy bsc_aw_utility.object_tb,
194 p_type varchar2
195 ) is
196 Begin
197   g_olap_object.delete;
198   if p_type='all' then
199     get_bsc_olap_object(null,null,p_kpi,'kpi',g_olap_object);
200   else
201     get_bsc_olap_object(null,p_type,p_kpi,'kpi',g_olap_object);
202   end if;
203   for i in 1..g_olap_object.count loop
204     if g_olap_object(i).olap_object_type is not null then
205       p_objects(p_objects.count+1).object_name:=g_olap_object(i).olap_object;
206       p_objects(p_objects.count).object_type:=g_olap_object(i).olap_object_type;
207     end if;
208   end loop;
209 Exception when others then
210   log_n('Exception in get_kpi_olap_objects '||sqlerrm);
211   raise;
212 End;
213 
214 /*
215 calendar is time dim. so it appears in the metadata like a dim
216 */
217 procedure delete_calendar(p_calendar bsc_aw_calendar.calendar_r) is
218 Begin
219   clear_all_cache;
220   drop_dim(p_calendar.dim_name);
221   clear_all_cache;
222 Exception when others then
223   log_n('Exception in delete_calendar '||sqlerrm);
224   raise;
225 End;
226 
227 procedure create_calendar(p_calendar bsc_aw_calendar.calendar_r) is
228 Begin
229   bsc_aw_md_wrapper.create_calendar(p_calendar);
230   clear_all_cache;
231 Exception when others then
232   log_n('Exception in create_calendar '||sqlerrm);
233   raise;
234 End;
235 
236 /*
237 given a dim find out all the properties
238 from bsc olap metadata
239 */
240 procedure get_dim_properties(p_dim in out nocopy bsc_aw_adapter_kpi.dim_r) is
241 l_property bsc_aw_utility.value_tb;
242 Begin
243   g_olap_object.delete;
244   --get_bsc_olap_object(p_dim.dim_name,'dimension',null,null,g_olap_object);
245   get_bsc_olap_object(null,null,p_dim.dim_name,'dimension',g_olap_object);
246   for i in 1..g_olap_object.count loop
247     if g_olap_object(i).object=p_dim.dim_name and g_olap_object(i).object_type='dimension' then
248       if g_olap_object(i).olap_object_type='concat dimension' then
249         p_dim.concat:='Y';
250       else
251         p_dim.concat:='N';
252       end if;
253       bsc_aw_utility.parse_parameter_values(g_olap_object(i).property1,',',l_property);
254       p_dim.property:=bsc_aw_utility.get_parameter_value(l_property,'dimension type'); --normal vs time
255       p_dim.recursive:=nvl(bsc_aw_utility.get_parameter_value(l_property,'recursive'),'N'); --Y or N
256       p_dim.recursive_norm_hier:=nvl(bsc_aw_utility.get_parameter_value(l_property,'normal hier'),'N');
257       p_dim.multi_level:=nvl(bsc_aw_utility.get_parameter_value(l_property,'multi level'),'N'); --Y or N
258     elsif g_olap_object(i).object_type='relation' then
259       --relation name can be null if there is no rollup on this dim
260       p_dim.relation_name:=g_olap_object(i).object;
261     elsif g_olap_object(i).object_type='level name dim' then
262       p_dim.level_name_dim:=g_olap_object(i).object;
263     elsif g_olap_object(i).object_type='base value cube' then
264       p_dim.base_value_cube:=g_olap_object(i).object;
265     end if;
266   end loop;
267 Exception when others then
268   log_n('Exception in get_dim_properties '||sqlerrm);
269   raise;
270 End;
271 
272 /*
273 given a calenadar find out all the properties
274 from bsc olap metadata
275 Input : calendar.aw_dim like bsc_calendar_1 NOT the calendar id
276 */
277 procedure get_calendar_properties(p_calendar in out nocopy bsc_aw_adapter_kpi.calendar_r) is
278 l_property bsc_aw_utility.value_tb;
279 Begin
280   g_olap_object.delete;
281   get_bsc_olap_object(null,null,p_calendar.aw_dim,'dimension',g_olap_object);
282   for i in 1..g_olap_object.count loop
283     if g_olap_object(i).object=p_calendar.aw_dim and g_olap_object(i).object_type='dimension' then
284       p_calendar.calendar:=bsc_aw_utility.get_parameter_value(g_olap_object(i).property1,'calendar',',');
285     elsif g_olap_object(i).object_type='relation' then
286       p_calendar.relation_name:=g_olap_object(i).object;
287     elsif g_olap_object(i).object_type='denorm relation' then
288       p_calendar.denorm_relation_name:=g_olap_object(i).object;
289     elsif g_olap_object(i).object_type='level name dim' then
290       p_calendar.level_name_dim:=g_olap_object(i).object;
291     elsif g_olap_object(i).object_type='end period level name dim' then
292       p_calendar.end_period_level_name_dim:=g_olap_object(i).object;
293     elsif g_olap_object(i).object_type='end period relation' then
294       p_calendar.end_period_relation_name:=g_olap_object(i).object;
295     end if;
296   end loop;
297 Exception when others then
298   log_n('Exception in get_calendar_properties '||sqlerrm);
299   raise;
300 End;
301 
302 /*
303 given a dim , get the full hier of the dim
304 the parent child relations are in bsc metadata. so why do we need an api here?
305 we need this because we need to see if there is any change to the parent child relation
306 bsc metadata will only contain the latest info
307 note>>>this loads parent child without reference to level groups
308 */
309 procedure get_dim_parent_child(p_dim varchar2,p_parent_child out nocopy bsc_aw_adapter_dim.dim_parent_child_tb) is
310 l_oo bsc_aw_md_wrapper.bsc_olap_object_tb;
311 l_oor bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
312 Begin
313   l_oo.delete;
314   get_bsc_olap_object(null,'dimension level',p_dim,'dimension',l_oo);
315   for i in 1..l_oo.count loop
316     l_oor.delete;
317     get_bsc_olap_object_relation(l_oo(i).object,l_oo(i).object_type,'parent level',p_dim,'dimension',l_oor);
318     for j in 1..l_oor.count loop
319       p_parent_child(p_parent_child.count+1).child_level:=l_oor(j).object;
320       p_parent_child(p_parent_child.count).parent_level:=l_oor(j).relation_object;
321       p_parent_child(p_parent_child.count).child_fk:=bsc_aw_utility.get_parameter_value(l_oor(j).property1,'fk',',');
322       p_parent_child(p_parent_child.count).parent_pk:=bsc_aw_utility.get_parameter_value(l_oor(j).property1,'pk',',');
323     end loop;
324   end loop;
325 Exception when others then
326   log_n('Exception in get_dim_parent_child '||sqlerrm);
327   raise;
328 End;
329 
330 procedure get_bsc_olap_object(
331 p_object varchar2,
332 p_type varchar2,
333 p_parent_object varchar2,
334 p_parent_type varchar2,
335 p_bsc_olap_object out nocopy bsc_aw_md_wrapper.bsc_olap_object_tb
336 ) is
337 --
338 l_cache_found varchar2(20);
339 l_bsc_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb;
340 Begin
341   l_cache_found:=get_oo_cache(p_object,p_type,p_parent_object,p_parent_type,l_bsc_olap_object);
342   if l_cache_found='N' then
343     bsc_aw_md_wrapper.get_bsc_olap_object(p_object,p_type,p_parent_object,p_parent_type,l_bsc_olap_object);
344     add_oo_cache(p_object,p_type,p_parent_object,p_parent_type,l_bsc_olap_object);
345   end if;
346   p_bsc_olap_object:=l_bsc_olap_object;
347 Exception when others then
348   log_n('Exception in get_bsc_olap_object '||sqlerrm);
349   raise;
350 End;
351 
352 function get_oo_cache(
353 p_object varchar2,
354 p_type varchar2,
355 p_parent_object varchar2,
356 p_parent_type varchar2,
357 p_bsc_olap_object out nocopy bsc_aw_md_wrapper.bsc_olap_object_tb
358 ) return varchar2 is
359 --
360 l_cache_found varchar2(20);
361 Begin
362   l_cache_found:='N';
363   for i in 1..g_oo_cache.count loop
364     if nvl(g_oo_cache(i).object,'^')=nvl(p_object,'^')
365     and nvl(g_oo_cache(i).object_type,'^')=nvl(p_type,'^')
366     and nvl(g_oo_cache(i).parent_object,'^')=nvl(p_parent_object,'^')
367     and nvl(g_oo_cache(i).parent_object_type,'^')=nvl(p_parent_type,'^') then
368       if g_oo_cache(i).bsc_olap_object.count > 0 then
369         p_bsc_olap_object:=g_oo_cache(i).bsc_olap_object;
370         l_cache_found:='Y';
371       end if;
372       exit;
373     end if;
374   end loop;
375   return l_cache_found;
376 Exception when others then
377   log_n('Exception in get_oo_cache '||sqlerrm);
378   raise;
379 End;
380 
381 procedure add_oo_cache(
382 p_object varchar2,
383 p_type varchar2,
384 p_parent_object varchar2,
385 p_parent_type varchar2,
386 p_bsc_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb
387 ) is
388 --
389 l_bsc_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb;
390 Begin
391   l_bsc_olap_object:=p_bsc_olap_object;
392   g_oo_cache(g_oo_cache.count+1).object:=p_object;
393   g_oo_cache(g_oo_cache.count).object_type:=p_type;
394   g_oo_cache(g_oo_cache.count).parent_object:=p_parent_object;
395   g_oo_cache(g_oo_cache.count).parent_object_type:=p_parent_type;
396   g_oo_cache(g_oo_cache.count).bsc_olap_object:=l_bsc_olap_object;
397 Exception when others then
398   log_n('Exception in add_oo_cache '||sqlerrm);
399   raise;
400 End;
401 
402 procedure get_bsc_olap_object_relation(
403 p_object varchar2,
404 p_object_type varchar2,
405 p_relation_type varchar2,
406 p_parent_object varchar2,
407 p_parent_object_type varchar2,
408 p_bsc_olap_object_relation out nocopy bsc_aw_md_wrapper.bsc_olap_object_relation_tb
409 ) is
410 --
411 l_cache_found varchar2(20);
412 l_bsc_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
413 Begin
414   l_cache_found:=get_oor_cache(p_object,p_object_type,p_relation_type,p_parent_object,p_parent_object_type,l_bsc_olap_object_relation);
415   if l_cache_found='N' then
416     bsc_aw_md_wrapper.get_bsc_olap_object_relation(p_object,p_object_type,p_relation_type,p_parent_object,p_parent_object_type,
417     l_bsc_olap_object_relation);
418     add_oor_cache(p_object,p_object_type,p_relation_type,p_parent_object,p_parent_object_type,l_bsc_olap_object_relation);
419   end if;
420   p_bsc_olap_object_relation:=l_bsc_olap_object_relation;
421 Exception when others then
422   log_n('Exception in get_bsc_olap_object_relation '||sqlerrm);
423   raise;
424 End;
425 
426 function get_oor_cache(
427 p_object varchar2,
428 p_object_type varchar2,
429 p_relation_type varchar2,
430 p_parent_object varchar2,
431 p_parent_object_type varchar2,
432 p_bsc_olap_object_relation out nocopy bsc_aw_md_wrapper.bsc_olap_object_relation_tb
433 ) return varchar2 is
434 --
435 l_cache_found varchar2(20);
436 Begin
437   l_cache_found:='N';
438   for i in 1..g_oor_cache.count loop
439     if nvl(g_oor_cache(i).object,'^')=nvl(p_object,'^')
440     and nvl(g_oor_cache(i).object_type,'^')=nvl(p_object_type,'^')
441     and nvl(g_oor_cache(i).relation_type,'^')=nvl(p_relation_type,'^')
442     and nvl(g_oor_cache(i).parent_object,'^')=nvl(p_parent_object,'^')
443     and nvl(g_oor_cache(i).parent_object_type,'^')=nvl(p_parent_object_type,'^')  then
444       if g_oor_cache(i).bsc_olap_object_relation.count > 0 then
445         p_bsc_olap_object_relation:=g_oor_cache(i).bsc_olap_object_relation;
446         l_cache_found:='Y';
447       end if;
448       exit;
449     end if;
450   end loop;
451   return l_cache_found;
452 Exception when others then
453   log_n('Exception in get_oor_cache '||sqlerrm);
454   raise;
455 End;
456 
457 procedure add_oor_cache(
458 p_object varchar2,
459 p_object_type varchar2,
460 p_relation_type varchar2,
461 p_parent_object varchar2,
462 p_parent_object_type varchar2,
463 p_bsc_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb
464 ) is
465 --
466 l_bsc_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
467 Begin
468   l_bsc_olap_object_relation:=p_bsc_olap_object_relation;
469   g_oor_cache(g_oor_cache.count+1).object:=p_object;
470   g_oor_cache(g_oor_cache.count).object_type:=p_object_type;
471   g_oor_cache(g_oor_cache.count).relation_type:=p_relation_type;
472   g_oor_cache(g_oor_cache.count).parent_object:=p_parent_object;
473   g_oor_cache(g_oor_cache.count).parent_object_type:=p_parent_object_type;
474   g_oor_cache(g_oor_cache.count).bsc_olap_object_relation:=l_bsc_olap_object_relation;
475 Exception when others then
476   log_n('Exception in add_oor_cache '||sqlerrm);
477   raise;
478 End;
479 
480 procedure create_kpi(p_kpi bsc_aw_adapter_kpi.kpi_r) is
481 Begin
482   bsc_aw_md_wrapper.create_kpi(p_kpi);
483   clear_all_cache;
484 Exception when others then
485   log_n('Exception in create_kpi '||sqlerrm);
486   raise;
487 End;
488 
489 /*
490 given a kpi, find the dims
491 will be used in the ui module
492 */
493 procedure get_dim_for_kpi(
494 p_kpi varchar2,
495 p_dim_list out nocopy dbms_sql.varchar2_table
496 ) is
497 Begin
498   g_olap_object_relation.delete;
499   get_bsc_olap_object_relation(p_kpi,'kpi','kpi dimension',p_kpi,'kpi',g_olap_object_relation);
500   for i in 1..g_olap_object_relation.count loop
501     p_dim_list(i):=g_olap_object_relation(i).relation_object;
502   end loop;
503 Exception when others then
504   log_n('Exception in get_dim_for_kpi '||sqlerrm);
505   raise;
506 End;
507 
508 --set the relation name, periodicity aw name and also the parent child info
509 procedure get_dim_set_calendar(
510 p_kpi bsc_aw_adapter_kpi.kpi_r,
511 p_dim_set in out nocopy bsc_aw_adapter_kpi.dim_set_r
512 ) is
513 --
514 l_periodicity dbms_sql.varchar2_table;
515 l_periodicity_type dbms_sql.varchar2_table;
516 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
517 l_oo bsc_aw_md_wrapper.bsc_olap_object_tb;
518 Begin
519   --get the relation name
520   l_oo.delete;
521   get_bsc_olap_object(p_dim_set.calendar.aw_dim,'dimension',p_dim_set.calendar.aw_dim,'dimension',l_oo);
522   get_calendar_properties(p_dim_set.calendar);
523   --from bsc olap metadata, get the properties of the periodicities
524   l_oo.delete;
525   get_bsc_olap_object(null,'dimension level',p_dim_set.calendar.aw_dim,'dimension',l_oo);
526   for i in 1..l_oo.count loop
527     l_periodicity(i):=null;
528     l_periodicity_type(i):=null;
529     l_periodicity(i):=bsc_aw_utility.get_parameter_value(l_oo(i).property1,'periodicity',',');
530     l_periodicity_type(i):=bsc_aw_utility.get_parameter_value(l_oo(i).property1,'periodicity_type',',');
531   end loop;
532   for i in 1..p_dim_set.calendar.periodicity.count loop
533     if p_dim_set.calendar.periodicity(i).aw_dim is null then
534       for j in 1..l_periodicity.count loop
535         if to_number(l_periodicity(j))=p_dim_set.calendar.periodicity(i).periodicity then
536           p_dim_set.calendar.periodicity(i).aw_dim:=l_oo(j).object;
537           p_dim_set.calendar.periodicity(i).periodicity_type:=l_periodicity_type(j);
538           exit;
539         end if;
540       end loop;
541     elsif p_dim_set.calendar.periodicity(i).periodicity is null then
542       for j in 1..l_oo.count loop
543         if p_dim_set.calendar.periodicity(i).aw_dim=l_oo(j).object then
544           p_dim_set.calendar.periodicity(i).periodicity:=to_number(l_periodicity(j));
545           exit;
546         end if;
547       end loop;
548     end if;
549   end loop;
550   --
551   --fill parent child info
552   l_olap_object_relation.delete;
553   p_dim_set.calendar.parent_child.delete;
554   get_bsc_olap_object_relation(null,null,'parent level',p_dim_set.calendar.aw_dim,'dimension',l_olap_object_relation);
555   for i in 1..l_olap_object_relation.count loop
556     p_dim_set.calendar.parent_child(p_dim_set.calendar.parent_child.count+1).parent_dim_name:=l_olap_object_relation(i).relation_object;
557     p_dim_set.calendar.parent_child(p_dim_set.calendar.parent_child.count).child_dim_name:=l_olap_object_relation(i).object;
558     p_dim_set.calendar.parent_child(p_dim_set.calendar.parent_child.count).parent:=to_number(
559     bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'parent periodicity',','));
560     p_dim_set.calendar.parent_child(p_dim_set.calendar.parent_child.count).child:=to_number(
561     bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'child periodicity',','));
562   end loop;
563 Exception when others then
564   log_n('Exception in get_dim_set_calendar '||sqlerrm);
565   raise;
566 End;
567 
568 function is_kpi_present(
569 p_kpi varchar2
570 )return boolean is
571 
572 Begin
573   g_olap_object.delete;
574   get_bsc_olap_object(p_kpi,'kpi',p_kpi,'kpi',g_olap_object);
575   if g_olap_object.count>0 then
576     return true;
577   else
578     return false;
579   end if;
580 Exception when others then
581   log_n('Exception in is_kpi_present '||sqlerrm);
582   raise;
583 End;
584 
585 procedure get_kpi_dimset(
586 p_kpi varchar2,
587 p_bsc_olap_object out nocopy bsc_aw_md_wrapper.bsc_olap_object_tb
588 ) is
589 Begin
590   get_bsc_olap_object(null,'kpi dimension set',p_kpi,'kpi',p_bsc_olap_object);
591 Exception when others then
592   log_n('Exception in get_kpi_dimset '||sqlerrm);
593   raise;
594 End;
595 
596 --only Actual dimset not targets
597 procedure get_kpi_dimset_actual(
598 p_kpi varchar2,
599 p_bsc_olap_object out nocopy bsc_aw_md_wrapper.bsc_olap_object_tb
600 ) is
601 --
602 l_bsc_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb;
603 Begin
604   get_kpi_dimset(p_kpi,l_bsc_olap_object);
605   for i in 1..l_bsc_olap_object.count loop
606     if bsc_aw_utility.get_parameter_value(l_bsc_olap_object(i).property1,'dim set type',',')='actual' then
607       p_bsc_olap_object(p_bsc_olap_object.count+1):=l_bsc_olap_object(i);
608     end if;
609   end loop;
610 Exception when others then
611   log_n('Exception in get_kpi_dimset_actual '||sqlerrm);
612   raise;
613 End;
614 
615 /*
616 given a kpi and a dimset, get all the base table loading the dimset
617 */
618 procedure get_dimset_base_table(
619 p_kpi varchar2,
620 p_dimset varchar2,
621 p_base_table_type varchar2,--"base table dim set"
622 p_olap_object_relation out nocopy bsc_aw_md_wrapper.bsc_olap_object_relation_tb
623 ) is
624 Begin
625   g_olap_object_relation.delete;
626   --get full relations for the kpi. then find out the base tables for the dimset
627   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',g_olap_object_relation);
628   if p_base_table_type is not null then
629     for i in 1..g_olap_object_relation.count loop
630       if g_olap_object_relation(i).object_type='base table' and g_olap_object_relation(i).relation_type=p_base_table_type
631       and g_olap_object_relation(i).relation_object=p_dimset then
632         p_olap_object_relation(p_olap_object_relation.count+1):=g_olap_object_relation(i);
633       end if;
634     end loop;
635   else
636     for i in 1..g_olap_object_relation.count loop
637       if g_olap_object_relation(i).object_type='base table' and g_olap_object_relation(i).relation_type='base table dim set'
638       and g_olap_object_relation(i).relation_object=p_dimset then
639         p_olap_object_relation(p_olap_object_relation.count+1):=g_olap_object_relation(i);
640       end if;
641     end loop;
642   end if;
643 Exception when others then
644   log_n('Exception in get_dimset_base_table '||sqlerrm);
645   raise;
646 End;
647 
648 /*
649 given a kpi and a base table, find out all the dimsets using the base table
650 */
651 procedure get_base_table_dimset(
652 p_kpi varchar2,
653 p_base_table varchar2,
654 p_base_table_type varchar2,--"base table dim set"
655 p_olap_object_relation out nocopy bsc_aw_md_wrapper.bsc_olap_object_relation_tb
656 ) is
657 Begin
658   g_olap_object_relation.delete;
659   --get full relations for the kpi. then find out the dimsets for the base table
660   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',g_olap_object_relation);
661   if p_base_table_type is not null then
662     for i in 1..g_olap_object_relation.count loop
663       if g_olap_object_relation(i).object_type='base table' and g_olap_object_relation(i).relation_type=p_base_table_type
664         and g_olap_object_relation(i).object=p_base_table then
665         p_olap_object_relation(p_olap_object_relation.count+1):=g_olap_object_relation(i);
666       end if;
667     end loop;
668   else
669     for i in 1..g_olap_object_relation.count loop
670       if g_olap_object_relation(i).object_type='base table' and g_olap_object_relation(i).relation_type='base table dim set'
671       and g_olap_object_relation(i).object=p_base_table then
672         p_olap_object_relation(p_olap_object_relation.count+1):=g_olap_object_relation(i);
673       end if;
674     end loop;
675   end if;
676 Exception when others then
677   log_n('Exception in get_base_table_dimset '||sqlerrm);
678   raise;
679 End;
680 
681 procedure get_dimset_measure(
682 p_kpi varchar2,
683 p_dimset varchar2,
684 p_measure out nocopy bsc_aw_adapter_kpi.measure_tb
685 ) is
686 --
687 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
688 l_values bsc_aw_utility.value_tb;
689 l_property varchar2(2000);
690 Begin
691   get_bsc_olap_object_relation(p_dimset,'kpi dimension set','dim set measure',p_kpi,'kpi',l_olap_object_relation);
692   --l_agg_formula:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'agg formula',',');
693   for i in 1..l_olap_object_relation.count loop
694     p_measure(p_measure.count+1).measure:=l_olap_object_relation(i).relation_object;
695     p_measure(p_measure.count).measure_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'measure type',',');
696     p_measure(p_measure.count).forecast:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'forecast',',');
697     p_measure(p_measure.count).forecast_method:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'forecast method',',');
698     p_measure(p_measure.count).sql_aggregated:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'sql aggregated',','),'N');
699     p_measure(p_measure.count).agg_formula.agg_formula:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'agg formula',',');
700     p_measure(p_measure.count).agg_formula.std_aggregation:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'std agg',',');
701     p_measure(p_measure.count).agg_formula.avg_aggregation:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'avg agg',',');
702     l_values.delete;
703     bsc_aw_utility.parse_parameter_values(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
704     'agg formula cubes',','),'+',l_values);
705     if l_values.count>0 then
706       for j in 1..l_values.count loop
707         p_measure(p_measure.count).agg_formula.cubes(p_measure(p_measure.count).agg_formula.cubes.count+1):=l_values(j).parameter;
708       end loop;
709     end if;
710     l_values.delete;
711     bsc_aw_utility.parse_parameter_values(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
712     'agg formula measures',','),'+',l_values);
713     if l_values.count>0 then
714       for j in 1..l_values.count loop
715         p_measure(p_measure.count).agg_formula.measures(p_measure(p_measure.count).agg_formula.measures.count+1):=l_values(j).parameter;
716       end loop;
717     end if;
718     --cannot change get_parameter_value to scanning bsc_olap_object even though bsc_olap_object has the cube and fcst cube etc
719     --in bsc_olap_object, we cannot know which measure belongs to which dimset
720     p_measure(p_measure.count).cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'cube',',');
721     p_measure(p_measure.count).fcst_cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'fcst cube',',');
722     p_measure(p_measure.count).countvar_cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'countvar cube',',');
723     p_measure(p_measure.count).display_cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'display cube',',');
724     l_property:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'balance loaded column',',');
725     if l_property is not null then
726       bsc_aw_utility.merge_property(p_measure(p_measure.count).property,'balance loaded column',null,l_property);
727     end if;
728     l_property:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'year cube',',');
729     if l_property is not null then
730       bsc_aw_utility.merge_property(p_measure(p_measure.count).property,'year cube',null,l_property);
731     end if;
732     l_property:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'period cube',',');
733     if l_property is not null then
734       bsc_aw_utility.merge_property(p_measure(p_measure.count).property,'period cube',null,l_property);
735     end if;
736     --in 10g we have composites per measure
737   end loop;
738 Exception when others then
739   log_n('Exception in get_dimset_measure '||sqlerrm);
740   raise;
741 End;
742 
743 /*
744 this procedure reads all metadata for a dimset from olap metadata
745 loads all info of a dimset
746 this api is important. will be used by kpi data loading, forecasting, aggregations etc
747 for now, we will keep this only for aggregation and forecasting
748 this means we are not concerned about the data source
749 
750 when we aggregate , we dont need the agg maps defined per dim . we need the agg maps defined per
751 dim only when we aggregate in the UI
752 */
753 procedure get_kpi_dimset_md(
754 p_kpi varchar2,
755 p_dimset_name varchar2,
756 p_dimset out nocopy bsc_aw_adapter_kpi.dim_set_r
757 ) is
758 --
759 l_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb;
760 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
761 l_num number;
762 Begin
763   --get all properties of the kpi. then loop through
764   get_bsc_olap_object(p_dimset_name,'kpi dimension set',p_kpi,'kpi',l_olap_object);
765   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
766   p_dimset.dim_set_name:=p_dimset_name;
767   --dimset properties
768   p_dimset.dim_set:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'dim set',',');
769   p_dimset.dim_set_type:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'dim set type',',');
770   p_dimset.base_dim_set:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'base dim set',',');
771   p_dimset.targets_higher_levels:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'targets',','),'N');
772   p_dimset.measurename_dim:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'measurename dim',',');
773   p_dimset.partition_dim:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'partition dim',',');
774   p_dimset.cube_design:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'cube design',',');
775   p_dimset.number_partitions:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'number partitions',',');
776   p_dimset.partition_type:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'partition type',',');
777   p_dimset.compressed:=bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'compressed',',');
778   p_dimset.pre_calculated:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object(1).property1,'pre calculated',','),'N');
779   --we are not looking at agg maps defined per dim
780   --agg_map_average is usedfor AVERAGE aggregation
781   --agg_map_notime is used for balance measures
782   for i in 1..l_olap_object_relation.count loop
783     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set agg map' then
784       p_dimset.agg_map.agg_map:=l_olap_object_relation(i).relation_object;
785       p_dimset.agg_map.created:='Y';
786     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set agg map notime' then
787       p_dimset.agg_map_notime.agg_map:=l_olap_object_relation(i).relation_object;
788       p_dimset.agg_map_notime.created:='Y';
789     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='agg map measure dim' then
790       p_dimset.aggmap_operator.measure_dim:=l_olap_object_relation(i).relation_object;
791     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='agg map opvar' then
792       p_dimset.aggmap_operator.opvar:=l_olap_object_relation(i).relation_object;
793     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='agg map argvar' then
794       p_dimset.aggmap_operator.argvar:=l_olap_object_relation(i).relation_object;
795     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='aggregate marker program' then
796       p_dimset.aggregate_marker_program:=l_olap_object_relation(i).relation_object;
797     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='LB resync program' then
798       p_dimset.LB_resync_program:=l_olap_object_relation(i).relation_object;
799     end if;
800   end loop;
801   --get the dim
802   get_kpi_dimset_dim_md(p_kpi,p_dimset_name,p_dimset.dim,p_dimset.std_dim);
803   --get calendar metadata
804   get_kpi_dimset_calendar_md(p_kpi,p_dimset_name,p_dimset.calendar);
805   --get the partition and composite info
806   get_dimset_comp_PT(p_kpi,p_dimset_name,p_dimset.partition_template,p_dimset.composite);
807   --get the cube info
808   get_dimset_cube_set(p_kpi,p_dimset_name,p_dimset.cube_set);
809   --get the measure information
810   get_dimset_measure(p_kpi,p_dimset_name,p_dimset.measure);
811 Exception when others then
812   log_n('Exception in get_kpi_dimset_md '||sqlerrm);
813   raise;
814 End;
815 
816 /*
817 get the partition template and composite info
818 */
819 procedure get_dimset_comp_PT(
820 p_kpi varchar2,
821 p_dimset_name varchar2,
822 p_partition_template out nocopy bsc_aw_adapter_kpi.partition_template_tb,
823 p_composite out nocopy bsc_aw_adapter_kpi.composite_tb) is
824 --
825 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
826 Begin
827   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
828   for i in 1..l_olap_object_relation.count loop
829     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set partition template' then
830       p_partition_template(p_partition_template.count+1).template_name:=l_olap_object_relation(i).relation_object;
831       p_partition_template(p_partition_template.count).template_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
832       'template type',',');
833       p_partition_template(p_partition_template.count).template_use:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
834       'template use',',');
835       p_partition_template(p_partition_template.count).template_dim:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
836       'template dim',',');
837       --now, the template partitions
838       for j in 1..l_olap_object_relation.count loop
839         if l_olap_object_relation(j).object=p_partition_template(p_partition_template.count).template_name and
840         l_olap_object_relation(j).relation_type='partition template partition' then
841           p_partition_template(p_partition_template.count).template_partitions(
842           p_partition_template(p_partition_template.count).template_partitions.count+1).partition_name:=l_olap_object_relation(j).relation_object;
843           p_partition_template(p_partition_template.count).template_partitions(
844           p_partition_template(p_partition_template.count).template_partitions.count).partition_dim_value:=
845           bsc_aw_utility.get_parameter_value(l_olap_object_relation(j).property1,'partition dim value',',');
846         end if;
847       end loop;
848       --we are not loading the partition axis info here. this info is not really reqd
849     end if;
850   end loop;
851   --get the composite info
852   for i in 1..l_olap_object_relation.count loop
853     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set measure composite' then
854       p_composite(p_composite.count+1).composite_name:=l_olap_object_relation(i).relation_object;
855       p_composite(p_composite.count).composite_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'composite type',',');
856     end if;
857   end loop;
858 Exception when others then
859   log_n('Exception in get_dimset_comp_PT '||sqlerrm);
860   raise;
861 End;
862 
863 /*
864 procedure to get the cube info
865 */
866 procedure get_dimset_cube_set(
867 p_kpi varchar2,
868 p_dimset_name varchar2,
869 p_cube_set out nocopy bsc_aw_adapter_kpi.cube_set_tb) is
870 --
871 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
872 Begin
873   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
874   for i in 1..l_olap_object_relation.count loop
875     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set cube set' then
876       p_cube_set(p_cube_set.count+1).cube_set_name:=l_olap_object_relation(i).relation_object;
877       p_cube_set(p_cube_set.count).cube_set_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'cube set type',',');
878       p_cube_set(p_cube_set.count).measurename_dim:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'measurename dim',',');
879       --cubes
880       get_dimset_cube(p_kpi,p_dimset_name,p_cube_set(p_cube_set.count).cube_set_name,'cube set measure cube',
881       p_cube_set(p_cube_set.count).cube);
882       get_dimset_cube(p_kpi,p_dimset_name,p_cube_set(p_cube_set.count).cube_set_name,'cube set countvar cube',
883       p_cube_set(p_cube_set.count).countvar_cube);
884       get_dimset_cube(p_kpi,p_dimset_name,p_cube_set(p_cube_set.count).cube_set_name,'cube set display cube',
885       p_cube_set(p_cube_set.count).display_cube);
886     end if;
887   end loop;
888 Exception when others then
889   log_n('Exception in get_dimset_cube_set '||sqlerrm);
890   raise;
891 End;
892 
893 /*
894 p_cube_type is cube set measure cube and cube set countvar cube
895 */
896 procedure get_dimset_cube(
897 p_kpi varchar2,
898 p_dimset_name varchar2,
899 p_cube_set_name varchar2,
900 p_cube_type varchar2,
901 p_cube out nocopy bsc_aw_adapter_kpi.cube_r) is
902 --
903 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
904 Begin
905   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
906   for i in 1..l_olap_object_relation.count loop
907     if l_olap_object_relation(i).object=p_cube_set_name and l_olap_object_relation(i).relation_type=p_cube_type then
908       p_cube.cube_name:=l_olap_object_relation(i).relation_object;
909       p_cube.cube_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'cube type',',');
910       p_cube.cube_datatype:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'cube datatype',',');
911     end if;
912   end loop;
913   --get the axis
914   for i in 1..l_olap_object_relation.count loop
915     if l_olap_object_relation(i).object=p_cube.cube_name and l_olap_object_relation(i).relation_type='cube axis' then
916       p_cube.cube_axis(p_cube.cube_axis.count+1).axis_name:=l_olap_object_relation(i).relation_object;
917       p_cube.cube_axis(p_cube.cube_axis.count).axis_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'axis type',',');
918     end if;
919   end loop;
920 Exception when others then
921   log_n('Exception in get_dimset_cube '||sqlerrm);
922   raise;
923 End;
924 
925 /*
926 get dimset dim properties
927 */
928 procedure get_kpi_dimset_dim_md(
929 p_kpi varchar2,
930 p_dimset_name varchar2,
931 p_dim out nocopy bsc_aw_adapter_kpi.dim_tb,
932 p_std_dim out nocopy bsc_aw_adapter_kpi.dim_tb
933 ) is
934 --
935 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
936 Begin
937   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
938   for i in 1..l_olap_object_relation.count loop
939     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set dim' then
940       p_dim(p_dim.count+1).dim_name:=l_olap_object_relation(i).relation_object;
941       get_kpi_dimset_dim_md(p_kpi,p_dimset_name,p_dim(p_dim.count),l_olap_object_relation(i).relation_type,
942       'dim set dim level');
943     elsif l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set std dim' then
944       p_std_dim(p_std_dim.count+1).dim_name:=l_olap_object_relation(i).relation_object;
945       get_kpi_dimset_dim_md(p_kpi,p_dimset_name,p_std_dim(p_std_dim.count),l_olap_object_relation(i).relation_type,
946       'dim set dim level');
947     end if;
948   end loop;
949 Exception when others then
950   log_n('Exception in get_kpi_dimset_dim_md '||sqlerrm);
951   raise;
952 End;
953 
954 /*
955 given a dim, get the properties and levels
956 p_dim.dim_name is known
957 p_dim.limit_cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'limit cube',',') is reqd since in
958 bsc_olap_object we do not know which limit cube is tied to which dim
959 
960 zero code is stored at the dim level, not at the dim level
961 p_level_type is "dim set dim level"
962 */
963 procedure get_kpi_dimset_dim_md(
964 p_kpi varchar2,
965 p_dimset_name varchar2,
966 p_dim in out nocopy bsc_aw_adapter_kpi.dim_r,
967 p_dim_type varchar2,
968 p_level_type varchar2
969 ) is
970 --
971 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
972 l_oor_zero_code bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
973 l_oor_rec_level bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
974 l_index number;
975 Begin
976   get_dim_properties(p_dim);--property,rec,multi level,leven name dim
977   --get the levels
978   --limit cube=kpi_3014_2_BSC_CCDIM_100.limit.bool,agg map=aggmap_BSC_CCDIM_100_2_3014
979   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
980   for i in 1..l_olap_object_relation.count loop
981     if l_olap_object_relation(i).relation_type=p_dim_type
982     and l_olap_object_relation(i).relation_object=p_dim.dim_name and l_olap_object_relation(i).object=p_dimset_name then
983       p_dim.limit_cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'limit cube',',');
984       p_dim.limit_cube_composite:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'limit cube composite',',');
985       p_dim.aggregate_marker:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'dim aggregate marker',',');
986       p_dim.agg_map.agg_map:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'agg map',',');
987       p_dim.agg_level:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'agg level',',');
988       exit;
989     end if;
990   end loop;
991   --get the levels
992   --need only level name and position
993   --no...we also need the parent child relations...the issue of diamond hierarchies and the need to specify the
994   --correct parent.child when limiting level name dim
995   --first gte the lowest level
996   p_dim.levels.delete;
997   p_dim.levels(p_dim.levels.count+1).level_name:=null;--init
998   for i in 1..l_olap_object_relation.count loop
999     if l_olap_object_relation(i).relation_type=p_level_type
1000     and l_olap_object_relation(i).object=p_dim.dim_name||'+'||p_dimset_name then
1001       if instr(l_olap_object_relation(i).property1,'lowest level')>0 then
1002         l_index:=1;
1003       else
1004         l_index:=p_dim.levels.count+1;--start with a min of 2
1005       end if;
1006       p_dim.levels(l_index).level_name:=l_olap_object_relation(i).relation_object;
1007       --p_dim.levels(l_index).position:=nvl(get_level_position(p_dim.levels(l_index).level_name),1);
1008       p_dim.levels(l_index).position:=nvl(to_number(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'position',',')),1);
1009       p_dim.levels(l_index).aggregated:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'aggregated',','),'Y');
1010       p_dim.levels(l_index).zero_aggregated:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'zero_aggregated',','),'Y');
1011       /*nvl(Y) for zero_aggregated for backward compatibility */
1012       p_dim.levels(l_index).zero_code:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'zero code',','),'N'); --Y or N
1013       if p_dim.levels(l_index).zero_code='Y' then
1014         l_oor_zero_code.delete;
1015         get_bsc_olap_object_relation(p_dim.levels(l_index).level_name,'dimension level','zero code level',p_dim.dim_name,'dimension',l_oor_zero_code);
1016         p_dim.levels(l_index).zero_code_level:=l_oor_zero_code(1).relation_object;
1017       end if;
1018       if p_dim.recursive='Y' then
1019         l_oor_rec_level.delete;
1020         get_bsc_olap_object_relation(p_dim.levels(l_index).level_name,'dimension level','recursive parent level',p_dim.dim_name,'dimension',l_oor_rec_level);
1021         p_dim.levels(l_index).rec_parent_level:=l_oor_rec_level(1).relation_object;
1022       end if;
1023     end if;
1024   end loop;
1025   --
1026   l_olap_object_relation.delete;
1027   get_bsc_olap_object_relation(null,null,'parent level',p_dim.dim_name,'dimension',l_olap_object_relation);
1028   for i in 1..l_olap_object_relation.count loop
1029     --we add the parent child relation if both the parent and the child are levels of the kpi
1030     if is_level_in_dim(p_dim,l_olap_object_relation(i).relation_object) and
1031     is_level_in_dim(p_dim,l_olap_object_relation(i).object) then
1032       p_dim.parent_child(p_dim.parent_child.count+1).parent_level:=l_olap_object_relation(i).relation_object;
1033       p_dim.parent_child(p_dim.parent_child.count).child_level:=l_olap_object_relation(i).object;
1034     end if;
1035   end loop;
1036 Exception when others then
1037   log_n('Exception in get_kpi_dimset_dim_md '||sqlerrm);
1038   raise;
1039 End;
1040 
1041 function is_level_in_dim(
1042 p_dim bsc_aw_adapter_kpi.dim_r,
1043 p_level varchar2) return boolean is
1044 Begin
1045   for i in 1..p_dim.levels.count loop
1046     if p_dim.levels(i).level_name=p_level then
1047       return true;
1048     end if;
1049   end loop;
1050   return false;
1051 Exception when others then
1052   log_n('Exception in is_level_in_dim '||sqlerrm);
1053   raise;
1054 End;
1055 
1056 /*
1057 given a dimset, get all the calendar metadata
1058 */
1059 procedure get_kpi_dimset_calendar_md(
1060 p_kpi varchar2,
1061 p_dimset_name varchar2,
1062 p_calendar out nocopy bsc_aw_adapter_kpi.calendar_r
1063 ) is
1064 --
1065 l_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
1066 l_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb;
1067 l_index number;
1068 Begin
1069   --dim set calendar
1070   --
1071   get_bsc_olap_object_relation(null,null,null,p_kpi,'kpi',l_olap_object_relation);
1072   for i in 1..l_olap_object_relation.count loop
1073     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set calendar' then
1074       p_calendar.aw_dim:=l_olap_object_relation(i).relation_object;
1075       get_calendar_properties(p_calendar);
1076       p_calendar.limit_cube:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'limit cube',',');
1077       p_calendar.limit_cube_composite:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'limit cube composite',',');
1078       p_calendar.aggregate_marker:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'dim aggregate marker',',');
1079       p_calendar.agg_map.agg_map:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'agg map',',');
1080       exit;
1081     end if;
1082   end loop;
1083   --get the level name dim
1084   get_bsc_olap_object(p_calendar.aw_dim,'dimension',p_calendar.aw_dim,'dimension',l_olap_object);
1085   get_calendar_properties(p_calendar);
1086   --get the periodicities
1087   --remember...for periodicities, lowest level is not periodicity(1). its indicated by the property lowest level only
1088   for i in 1..l_olap_object_relation.count loop
1089     if l_olap_object_relation(i).object=p_dimset_name and l_olap_object_relation(i).relation_type='dim set periodicity' then
1090       p_calendar.periodicity(p_calendar.periodicity.count+1).aw_dim:=l_olap_object_relation(i).relation_object;
1091       p_calendar.periodicity(p_calendar.periodicity.count).periodicity:=to_number(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
1092       'periodicity',','));
1093       p_calendar.periodicity(p_calendar.periodicity.count).lowest_level:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
1094       'lowest level',','),'N');
1095       p_calendar.periodicity(p_calendar.periodicity.count).missing_level:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
1096       'missing level',','),'N');
1097       p_calendar.periodicity(p_calendar.periodicity.count).aggregated:=nvl(bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
1098       'aggregated',','),'Y');
1099       p_calendar.periodicity(p_calendar.periodicity.count).periodicity_type:=bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,
1100       'periodicity_type',',');
1101     end if;
1102   end loop;
1103   --load the periodicity relations
1104   l_olap_object_relation.delete;
1105   p_calendar.parent_child.delete;
1106   get_bsc_olap_object_relation(null,null,'parent level',p_calendar.aw_dim,'dimension',l_olap_object_relation);
1107   for i in 1..l_olap_object_relation.count loop
1108     if is_periodicity_in_dim(p_calendar,l_olap_object_relation(i).relation_object) and
1109     is_periodicity_in_dim(p_calendar,l_olap_object_relation(i).object) then
1110       p_calendar.parent_child(p_calendar.parent_child.count+1).parent_dim_name:=l_olap_object_relation(i).relation_object;
1111       p_calendar.parent_child(p_calendar.parent_child.count).child_dim_name:=l_olap_object_relation(i).object;
1112       p_calendar.parent_child(p_calendar.parent_child.count).parent:=to_number(
1113       bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'parent periodicity',','));
1114       p_calendar.parent_child(p_calendar.parent_child.count).child:=to_number(
1115       bsc_aw_utility.get_parameter_value(l_olap_object_relation(i).property1,'child periodicity',','));
1116     end if;
1117   end loop;
1118 Exception when others then
1119   log_n('Exception in get_kpi_dimset_calendar_md '||sqlerrm);
1120   raise;
1121 End;
1122 
1123 function is_periodicity_in_dim(
1124 p_calendar bsc_aw_adapter_kpi.calendar_r,
1125 p_periodicty_dim varchar2
1126 )return boolean is
1127 Begin
1128   for i in 1..p_calendar.periodicity.count loop
1129     if p_calendar.periodicity(i).aw_dim=p_periodicty_dim then
1130       return true;
1131     end if;
1132   end loop;
1133   return false;
1134 Exception when others then
1135   log_n('Exception in is_periodicity_in_dim '||sqlerrm);
1136   raise;
1137 End;
1138 
1139 /*
1140 this procedure sets the aggregation_r datatype in bsc_aw_load_kpi
1141 input : kpi
1142 find out all the dimsets for the kpi.
1143 the dimsets will include both actuals and targets
1144 */
1145 procedure get_aggregation_r(p_aggregation in out nocopy bsc_aw_load_kpi.aggregation_r) is
1146 --
1147 l_kpi bsc_aw_adapter_kpi.kpi_r;
1148 Begin
1149   l_kpi.kpi:=p_aggregation.kpi;
1150   get_kpi(l_kpi);
1151   --
1152   p_aggregation.parent_kpi:=l_kpi.parent_kpi;
1153   --
1154   for i in 1..l_kpi.dim_set.count loop
1155     p_aggregation.dim_set(p_aggregation.dim_set.count+1):=l_kpi.dim_set(i);
1156   end loop;
1157   for i in 1..l_kpi.target_dim_set.count loop
1158     p_aggregation.dim_set(p_aggregation.dim_set.count+1):=l_kpi.target_dim_set(i);
1159   end loop;
1160 Exception when others then
1161   log_n('Exception in get_aggregation_r '||sqlerrm);
1162   raise;
1163 End;
1164 
1165 /*input is the kpi name. all other metadata is populated
1166 */
1167 procedure get_kpi(p_kpi in out nocopy bsc_aw_adapter_kpi.kpi_r) is
1168 l_oo bsc_aw_md_wrapper.bsc_olap_object_tb;
1169 l_dim_set varchar2(300);
1170 Begin
1171   --get kpi properties
1172   if g_debug then
1173     log('In get_kpi '||p_kpi.kpi);
1174   end if;
1175   get_bsc_olap_object(p_kpi.kpi,'kpi',p_kpi.kpi,'kpi',l_oo);
1176   if l_oo.count=0 then
1177     log('Could not find kpi info');
1178     raise bsc_aw_utility.g_exception;
1179   end if;
1180   p_kpi.parent_kpi:=bsc_aw_utility.get_parameter_value(l_oo(1).property1,'parent kpi',','); --could be null
1181   p_kpi.calendar:=bsc_aw_utility.get_parameter_value(l_oo(1).property1,'calendar',',');
1182   --now the dimsets
1183   l_oo.delete;
1184   get_kpi_dimset(p_kpi.kpi,l_oo);
1185   for i in 1..l_oo.count loop
1186     if bsc_aw_utility.get_parameter_value(l_oo(i).property1,'dim set type',',')='actual' then
1187       l_dim_set:=l_oo(i).object;
1188       get_kpi_dimset_md(p_kpi.kpi,l_dim_set,p_kpi.dim_set(p_kpi.dim_set.count+1));
1189     end if;
1190   end loop;
1191   --targets
1192   for i in 1..l_oo.count loop
1193     if bsc_aw_utility.get_parameter_value(l_oo(i).property1,'dim set type',',')='target' then
1194       l_dim_set:=l_oo(i).object;
1195       get_kpi_dimset_md(p_kpi.kpi,l_dim_set,p_kpi.target_dim_set(p_kpi.target_dim_set.count+1));
1196     end if;
1197   end loop;
1198   --
1199 Exception when others then
1200   log_n('Exception in get_kpi '||sqlerrm);
1201   raise;
1202 End;
1203 
1204 -----------------------------
1205 procedure create_workspace(p_name varchar2) is
1206 Begin
1207   bsc_aw_md_wrapper.create_workspace(p_name);
1208 Exception when others then
1209   log_n('Exception in create_workspace '||sqlerrm);
1210   raise;
1211 End;
1212 
1213 procedure drop_workspace(p_name varchar2) is
1214 Begin
1215   clear_all_cache;
1216   bsc_aw_md_wrapper.drop_workspace(p_name);
1217   clear_all_cache;
1218 Exception when others then
1219   log_n('Exception in create_workspace '||sqlerrm);
1220   raise;
1221 End;
1222 
1223 function check_workspace(p_workspace_name varchar2) return varchar2 is
1224 l_olap_object bsc_aw_md_wrapper.bsc_olap_object_tb;
1225 Begin
1226   get_bsc_olap_object(p_workspace_name,'aw workspace','BSC','APPS',l_olap_object);
1227   if l_olap_object.count>0 then
1228     return 'Y';
1229   else
1230     return 'N';
1231   end if;
1232 Exception when others then
1233   log_n('Exception in check_workspace '||sqlerrm);
1234   raise;
1235 End;
1236 
1237 /*
1238 p_object varchar2,
1239 p_object_type varchar2,
1240 p_parent_object varchar2,
1241 p_parent_object_type varchar2,
1242 are mandatory
1243 optional (match or set)
1244 p_olap_object varchar2,
1245 p_olap_object_type varchar2,
1246 p_property varchar2,
1247 p_operation_flag varchar2
1248 */
1249 procedure update_olap_object(
1250 p_object varchar2,
1251 p_object_type varchar2,
1252 p_parent_object varchar2,
1253 p_parent_object_type varchar2,
1254 p_match_columns varchar2, --comma separated
1255 p_match_values varchar2, --comma separated
1256 p_set_columns varchar2, --comma separated
1257 p_set_values varchar2 --^ separated. since values can contain , inside
1258 ) is
1259 --
1260 l_match_columns dbms_sql.varchar2_table;
1261 l_match_values dbms_sql.varchar2_table;
1262 l_set_columns dbms_sql.varchar2_table;
1263 l_set_values dbms_sql.varchar2_table;
1264 Begin
1265   clear_all_cache;
1266   bsc_aw_utility.parse_parameter_values(p_match_columns,',',l_match_columns);
1267   bsc_aw_utility.parse_parameter_values(p_match_values,',',l_match_values);
1268   bsc_aw_utility.parse_parameter_values(p_set_columns,',',l_set_columns);
1269   bsc_aw_utility.parse_parameter_values(p_set_values,'^',l_set_values);
1270   bsc_aw_md_wrapper.update_olap_object(p_object,p_object_type,p_parent_object,p_parent_object_type,
1271   l_match_columns,l_match_values,l_set_columns,l_set_values);
1272   --invalidate cache
1273   clear_all_cache;
1274 Exception when others then
1275   log_n('Exception in update_olap_object '||sqlerrm);
1276   raise;
1277 End;
1278 
1279 /*
1280 p_object varchar2,
1281 p_object_type varchar2,
1282 p_relation_type varchar2,
1283 p_parent_object varchar2,
1284 p_parent_object_type varchar2,
1285 are mandatory
1286 optional (match or set)
1287 relation object, relation object type, property
1288 */
1289 procedure update_olap_object_relation(
1290 p_object varchar2,
1291 p_object_type varchar2,
1292 p_relation_type varchar2,
1293 p_parent_object varchar2,
1294 p_parent_object_type varchar2,
1295 p_match_columns varchar2, --comma separated
1296 p_match_values varchar2, --comma separated
1297 p_set_columns varchar2, --comma separated
1298 p_set_values varchar2 --^ separated
1299 ) is
1300 --
1301 l_match_columns dbms_sql.varchar2_table;
1302 l_match_values dbms_sql.varchar2_table;
1303 l_set_columns dbms_sql.varchar2_table;
1304 l_set_values dbms_sql.varchar2_table;
1305 Begin
1306   clear_all_cache;
1307   bsc_aw_utility.parse_parameter_values(p_match_columns,',',l_match_columns);
1308   bsc_aw_utility.parse_parameter_values(p_match_values,',',l_match_values);
1309   bsc_aw_utility.parse_parameter_values(p_set_columns,',',l_set_columns);
1310   bsc_aw_utility.parse_parameter_values(p_set_values,'^',l_set_values);
1311   bsc_aw_md_wrapper.update_olap_object_relation(p_object,p_object_type,p_relation_type,p_parent_object,p_parent_object_type,
1312   l_match_columns,l_match_values,l_set_columns,l_set_values);
1313   clear_all_cache;
1314 Exception when others then
1315   log_n('Exception in update_olap_object_relation '||sqlerrm);
1316   raise;
1317 End;
1318 
1319 procedure insert_olap_object(
1320 p_object varchar2,
1321 p_object_type varchar2,
1322 p_olap_object varchar2,
1323 p_olap_object_type varchar2,
1324 p_parent_object varchar2,
1325 p_parent_object_type varchar2,
1326 p_property1 varchar2
1327 ) is
1328 Begin
1329   /*insert has no cache invalidation */
1330   bsc_aw_md_wrapper.insert_olap_object(p_object,p_object_type,p_olap_object,p_olap_object_type,p_parent_object,p_parent_object_type,p_property1);
1331 Exception when others then
1332   log_n('Exception in insert_olap_object '||sqlerrm);
1333   raise;
1334 End;
1335 
1336 procedure insert_olap_object_relation(
1337 p_object varchar2,
1338 p_object_type varchar2,
1339 p_relation_object varchar2,
1340 p_relation_object_type varchar2,
1341 p_relation_type varchar2,
1342 p_parent_object varchar2,
1343 p_parent_object_type varchar2,
1344 p_property1 varchar2
1345 ) is
1346 Begin
1347   /*insert has no cache invalidation */
1348   bsc_aw_md_wrapper.insert_olap_object_relation(p_object,p_object_type,p_relation_object,p_relation_object_type,p_relation_type,
1349   p_parent_object,p_parent_object_type,p_property1);
1350 Exception when others then
1351   log_n('Exception in insert_olap_object_relation '||sqlerrm);
1352   raise;
1353 End;
1354 
1355 
1356 /*
1357 we store current change vector value for a base table. called from top loader pack bscawlob.pls
1358 3 api. one to create metadata entry, one to get the current value. one to update to a new value
1359 get_base_table_change_vector will return null if the base table is not in olap object relation
1360 also creates an entry for current period
1361 */
1362 procedure create_bt_change_vector(p_base_table varchar2) is
1363 l_cv_value number;
1364 Begin
1365   l_cv_value:=get_bt_change_vector(p_base_table);
1366   if l_cv_value is null then --create entry
1367     bsc_aw_md_wrapper.insert_olap_object_relation(p_base_table,'base table','0','change vector','base table change vector',
1368     p_base_table,'base table',null);
1369     bsc_aw_md_wrapper.insert_olap_object_relation(p_base_table,'base table',null,'current period','base table current period',
1370     p_base_table,'base table',null);
1371   end if;
1372   clear_all_cache;
1373 Exception when others then
1374   log_n('Exception in create_bt_change_vector '||sqlerrm);
1375   raise;
1376 End;
1377 
1378 procedure drop_bt_change_vector(p_base_table varchar2) is
1379 Begin
1380   clear_all_cache;
1381   bsc_aw_md_wrapper.delete_olap_object_relation(p_base_table,'base table','base table change vector',null,null,p_base_table,'base table');
1382   bsc_aw_md_wrapper.delete_olap_object_relation(p_base_table,'base table','base table current period',null,null,p_base_table,'base table');
1383   clear_all_cache;
1384 Exception when others then
1385   log_n('Exception in drop_bt_change_vector '||sqlerrm);
1386   raise;
1387 End;
1388 
1389 function get_bt_change_vector(p_base_table varchar2) return number is
1390 l_bsc_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
1391 Begin
1392   get_bsc_olap_object_relation(p_base_table,'base table','base table change vector',p_base_table,'base table',l_bsc_olap_object_relation);
1393   if l_bsc_olap_object_relation.count=0 then
1394     return null;
1395   else
1396     return to_number(l_bsc_olap_object_relation(1).relation_object);
1397   end if;
1398 Exception when others then
1399   log_n('Exception in get_bt_change_vector '||sqlerrm);
1400   raise;
1401 End;
1402 
1403 function get_bt_current_period(p_base_table varchar2) return varchar2 is
1404 l_bsc_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
1405 Begin
1406   get_bsc_olap_object_relation(p_base_table,'base table','base table current period',p_base_table,'base table',l_bsc_olap_object_relation);
1407   if l_bsc_olap_object_relation.count=0 then
1408     return null;
1409   else
1410     return l_bsc_olap_object_relation(1).relation_object;
1411   end if;
1412 Exception when others then
1413   log_n('Exception in get_bt_current_period '||sqlerrm);
1414   raise;
1415 End;
1416 
1417 procedure update_bt_change_vector(p_base_table varchar2, p_value number) is
1418 Begin
1419   update_olap_object_relation(p_base_table,'base table','base table change vector',p_base_table,'base table',
1420   null,null,'relation_object',to_char(p_value));
1421 Exception when others then
1422   log_n('Exception in update_bt_change_vector '||sqlerrm);
1423   raise;
1424 End;
1425 
1426 /*to set the current period of the B table , p_value is period.year format at the periodicity of the B table
1427 we need this value to set projection and balance aggregations on time to null when the cp moves forward*/
1428 procedure update_bt_current_period(p_base_table varchar2,p_value varchar2) is
1429 Begin
1430   update_olap_object_relation(p_base_table,'base table','base table current period',p_base_table,'base table',
1431   null,null,'relation_object',p_value);
1432 Exception when others then
1433   log_n('Exception in update_bt_current_period '||sqlerrm);
1434   raise;
1435 End;
1436 
1437 /*
1438 given a bsc_olap_object_relation_tb and a relation type, get all the relation objects
1439 */
1440 procedure get_relation_object(
1441 p_olap_object_relation bsc_aw_md_wrapper.bsc_olap_object_relation_tb,
1442 p_relation_type varchar2,
1443 p_relation_object in out nocopy dbms_sql.varchar2_table
1444 ) is
1445 Begin
1446   for i in 1..p_olap_object_relation.count loop
1447     if p_olap_object_relation(i).relation_type=p_relation_type then
1448       p_relation_object(p_relation_object.count+1):=p_olap_object_relation(i).relation_object;
1449     end if;
1450   end loop;
1451 Exception when others then
1452   log_n('Exception in get_relation_object '||sqlerrm);
1453   raise;
1454 End;
1455 
1456 procedure clear_all_cache is
1457 Begin
1458   g_oo_cache.delete;
1459   g_oor_cache.delete;
1460 Exception when others then
1461   log_n('Exception in clear_all_cache '||sqlerrm);
1462   raise;
1463 End;
1464 
1465 /*
1466 for a dim, load the dimension_r structure
1467 */
1468 procedure get_dim_md(p_dim_name varchar2,p_dimension out nocopy bsc_aw_adapter_dim.dimension_r) is
1469 l_oo bsc_aw_md_wrapper.bsc_olap_object_tb;
1470 l_oor bsc_aw_md_wrapper.bsc_olap_object_relation_tb;
1471 l_lg_index bsc_aw_utility.number_table; --level group
1472 l_rl_index bsc_aw_utility.number_table;--rec level
1473 l_lg varchar2(200);
1474 l_default_lg_name varchar2(200);
1475 l_level_name_dim varchar2(300);
1476 Begin
1477   get_bsc_olap_object(null,null,p_dim_name,'dimension',l_oo);
1478   get_bsc_olap_object_relation(null,null,null,p_dim_name,'dimension',l_oor);
1479   l_default_lg_name:=bsc_aw_adapter_dim.get_default_lg_name;
1480   --dim properties
1481   p_dimension.dim_name:=p_dim_name;
1482   for i in 1..l_oo.count loop
1483     if l_oo(i).object=p_dim_name and l_oo(i).object_type='dimension' then
1484       if l_oo(i).olap_object_type='concat dimension' then
1485         p_dimension.concat:='Y';
1486       else
1487         p_dimension.concat:='N';
1488       end if;
1489       p_dimension.property:=l_oo(i).property1;
1490       p_dimension.dim_type:=bsc_aw_utility.get_parameter_value(l_oo(i).property1,'dimension source type',',');
1491       p_dimension.corrected:=nvl(bsc_aw_utility.get_parameter_value(l_oo(i).property1,'corrected',','),'N');
1492       p_dimension.recursive:=nvl(bsc_aw_utility.get_parameter_value(l_oo(i).property1,'recursive',','),'N');
1493       p_dimension.recursive_norm_hier:=nvl(bsc_aw_utility.get_parameter_value(l_oo(i).property1,'normal hier',','),'N');
1494       p_dimension.relation_name:=bsc_aw_utility.get_parameter_value(l_oo(i).property1,'relation name',',');
1495       p_dimension.level_name_dim:=bsc_aw_utility.get_parameter_value(l_oo(i).property1,'level name dim',',');
1496     elsif l_oo(i).object_type='filter cube' then
1497       p_dimension.filter_variable:=l_oo(i).object;
1498     elsif l_oo(i).object_type='limit cube' then
1499       p_dimension.limit_variable:=l_oo(i).object;
1500     elsif l_oo(i).object_type='rec level position cube' then
1501       p_dimension.rec_level_position_cube:=l_oo(i).object;
1502     elsif l_oo(i).object_type='base value cube' then
1503       p_dimension.base_value_cube:=l_oo(i).object;
1504     elsif l_oo(i).object_type='dml program' and l_oo(i).olap_object_type='dml program initial load' then
1505       p_dimension.initial_load_program:=l_oo(i).object;
1506     elsif l_oo(i).object_type='dml program' and l_oo(i).olap_object_type='dml program inc load' then
1507       p_dimension.inc_load_program:=l_oo(i).object;
1508       --bug fix 5636695
1509     elsif l_oo(i).object_type='level name dim' then
1510       l_level_name_dim:=l_oo(i).object;
1511     end if;
1512   end loop;
1513   --bug fix 5636695
1514   -- if in property1 level name dim is null, we will get it differently.
1515   -- I have also fixed the issue where we are putting null value for level dim name in property1
1516   -- But the following code is added for already existing dimension
1517   if  p_dimension.level_name_dim is null then
1518     p_dimension.level_name_dim := l_level_name_dim;
1519   end if;
1520   --level groups
1521   for i in 1..l_oo.count loop
1522     if l_oo(i).object_type='level group' then
1523       p_dimension.level_groups(p_dimension.level_groups.count+1).level_group_name:=l_oo(i).object;
1524       l_lg_index(l_oo(i).object):=p_dimension.level_groups.count;
1525     end if;
1526   end loop;
1527   if p_dimension.level_groups.count=0 then --backward compatibility
1528     p_dimension.level_groups(p_dimension.level_groups.count+1).level_group_name:=l_default_lg_name;
1529     l_lg_index(l_default_lg_name):=p_dimension.level_groups.count;
1530   end if;
1531   --get level group levels, relations, data source
1532   for i in 1..l_oo.count loop
1533     if l_oo(i).object_type='dimension level' then
1534       l_lg:=nvl(bsc_aw_utility.get_parameter_value(l_oo(i).property1,'level group',','),l_default_lg_name);
1535       p_dimension.level_groups(l_lg_index(l_lg)).levels(p_dimension.level_groups(l_lg_index(l_lg)).levels.count+1).level_name:=l_oo(i).object;
1536       p_dimension.level_groups(l_lg_index(l_lg)).levels(p_dimension.level_groups(l_lg_index(l_lg)).levels.count).position:=
1537       to_number(bsc_aw_utility.get_parameter_value(l_oo(i).property1,'position',','));
1538       p_dimension.level_groups(l_lg_index(l_lg)).levels(p_dimension.level_groups(l_lg_index(l_lg)).levels.count).pk.pk:=
1539       bsc_aw_utility.get_parameter_value(l_oo(i).property1,'pk',',');
1540     elsif l_oo(i).object_type='recursive level' then
1541       l_lg:=nvl(bsc_aw_utility.get_parameter_value(l_oo(i).property1,'level group',','),l_default_lg_name);
1542       p_dimension.level_groups(l_lg_index(l_lg)).rec_levels(p_dimension.level_groups(l_lg_index(l_lg)).rec_levels.count+1).level_name:=
1543       l_oo(i).object;
1544       l_rl_index(l_oo(i).object):=p_dimension.level_groups(l_lg_index(l_lg)).rec_levels.count;
1545     end if;
1546   end loop;
1547   --olap object relations
1548   for i in 1..l_oor.count loop
1549     if l_oor(i).relation_type='dimension kpi' then
1550       p_dimension.kpi_for_dim(p_dimension.kpi_for_dim.count+1).kpi:=l_oor(i).relation_object;
1551     elsif l_oor(i).relation_type='zero code level' then
1552       l_lg:=nvl(bsc_aw_utility.get_parameter_value(l_oor(i).property1,'level group',','),l_default_lg_name);
1553       p_dimension.level_groups(l_lg_index(l_lg)).zero_levels(p_dimension.level_groups(l_lg_index(l_lg)).zero_levels.count+1).level_name:=
1554       l_oor(i).relation_object;
1555       p_dimension.level_groups(l_lg_index(l_lg)).zero_levels(p_dimension.level_groups(l_lg_index(l_lg)).zero_levels.count).child_level_name:=
1556       l_oor(i).object;
1557     elsif l_oor(i).relation_type='recursive parent level' then
1558       l_lg:=nvl(bsc_aw_utility.get_parameter_value(l_oor(i).property1,'level group',','),l_default_lg_name);
1559       p_dimension.level_groups(l_lg_index(l_lg)).rec_levels(l_rl_index(l_oor(i).relation_object)).child_level_name:=l_oor(i).object;
1560     elsif l_oor(i).relation_type='parent level' then
1561       l_lg:=nvl(bsc_aw_utility.get_parameter_value(l_oor(i).property1,'level group',','),l_default_lg_name);
1562       p_dimension.level_groups(l_lg_index(l_lg)).parent_child(p_dimension.level_groups(l_lg_index(l_lg)).parent_child.count+1).child_level:=
1563       l_oor(i).object;
1564       p_dimension.level_groups(l_lg_index(l_lg)).parent_child(p_dimension.level_groups(l_lg_index(l_lg)).parent_child.count).parent_level:=
1565       l_oor(i).relation_object;
1566       p_dimension.level_groups(l_lg_index(l_lg)).parent_child(p_dimension.level_groups(l_lg_index(l_lg)).parent_child.count).parent_pk:=
1567       bsc_aw_utility.get_parameter_value(l_oor(i).property1,'pk',',');
1568       p_dimension.level_groups(l_lg_index(l_lg)).parent_child(p_dimension.level_groups(l_lg_index(l_lg)).parent_child.count).child_fk:=
1569       bsc_aw_utility.get_parameter_value(l_oor(i).property1,'fk',',');
1570     end if;
1571   end loop;
1572   --get the snowflake info also
1573   for i in 1..p_dimension.level_groups.count loop
1574     for j in 1..p_dimension.level_groups(i).levels.count loop
1575       l_oo.delete;
1576       get_bsc_olap_object(null,'dimension',p_dimension.level_groups(i).levels(j).level_name,'dimension',l_oo);
1577       p_dimension.level_groups(i).levels(j).relation_name:=bsc_aw_utility.get_parameter_value(l_oo(1).property1,'relation name',',');
1578       p_dimension.level_groups(i).levels(j).level_name_dim:=bsc_aw_utility.get_parameter_value(l_oo(1).property1,'level name dim',',');
1579     end loop;
1580   end loop;
1581 Exception when others then
1582   log_n('Exception in get_dim_md '||sqlerrm);
1583   raise;
1584 End;
1585 
1586 procedure analyze_md_tables is
1587 Begin
1588   bsc_aw_md_wrapper.analyze_md_tables;
1589 Exception when others then
1590   log_n('Exception in analyze_md_tables '||sqlerrm);
1591   raise;
1592 End;
1593 
1594 function get_upgrade_version return number is
1595 l_oo bsc_aw_md_wrapper.bsc_olap_object_tb;
1596 Begin
1597   bsc_aw_md_api.get_bsc_olap_object('bsc aw version','bsc aw version','bsc aw version','bsc aw version',l_oo);
1598   if l_oo.count>0 then
1599     return to_number(l_oo(1).olap_object);
1600   else
1601     return 0;
1602   end if;
1603 Exception when others then
1604   log_n('Exception in get_upgrade_version '||sqlerrm);
1605   raise;
1606 End;
1607 
1608 procedure set_upgrade_version(p_version number) is
1609 l_oo bsc_aw_md_wrapper.bsc_olap_object_tb;
1610 Begin
1611   bsc_aw_md_api.get_bsc_olap_object('bsc aw version','bsc aw version','bsc aw version','bsc aw version',l_oo);
1612   if l_oo.count>0 then
1613     update_olap_object('bsc aw version','bsc aw version','bsc aw version','bsc aw version',
1614     null,null,'olap_object,olap_object_type',bsc_aw_utility.g_upgrade_version||'^bsc aw version');
1615   else /*first time*/
1616     insert_olap_object('bsc aw version','bsc aw version',to_char(bsc_aw_utility.g_upgrade_version),'bsc aw version','bsc aw version',
1617     'bsc aw version',null);
1618   end if;
1619 Exception when others then
1620   log_n('Exception in set_upgrade_version '||sqlerrm);
1621   raise;
1622 End;
1623 
1624 -----------------------------
1625 procedure init_all is
1626 Begin
1627   bsc_aw_md_wrapper.set_context('AW');
1628   g_debug:=bsc_aw_utility.g_debug;
1629 Exception when others then
1630   null;
1631 End;
1632 
1633 procedure log(p_message varchar2) is
1634 Begin
1635   bsc_aw_utility.log(p_message);
1636 Exception when others then
1637   null;
1638 End;
1639 
1640 procedure log_n(p_message varchar2) is
1641 Begin
1642   log('  ');
1643   log(p_message);
1644 Exception when others then
1645   null;
1646 End;
1647 
1648 END BSC_AW_MD_API;