
--freemarker template
<sqlvars>
<sqlvar name="sva_sgd_aggr_exists">
select sp_table_exists('sva_sgd_aggr') from xdummy;
</sqlvar>
<sqlvar name="fact_table_source">
select name
       from sx_tables where name ='sva_sgd_aggr'
       
</sqlvar>
<sqlvar name="added_tables" type="hashsequence"><![CDATA[
select 1::smallint as sortnr,
name, trim(name) ||'_'   as prefix,
caption,
'sva_sgd.sgd_join_id=sva_sgd_aggr.stellen_nr' as joinclause
       from sx_tables where name  in ('sva_sgd')
       union
select 2::smallint as sortnr,
name, trim(name) ||'_'   as prefix,
caption,
'sva_sgd_aggr.stellen_nr=sva_pbe_aggr.stellen_nr and (sva_sgd_aggr.sbst_nr=sva_pbe_aggr.soe_serial or sva_pbe_aggr.soe_serial is null )' as joinclause
       from sx_tables where name  in ('sva_pbe_aggr')
]]></sqlvar>
<sqlvar name="fields_target" type="hashsequence"><![CDATA[
<#if fact_table_source?exists>
select tid, table_name,
       name,
       name as targetname
       from sx_fields where table_name ='${fact_table_source}'
       and currentlyused=1

       union
</#if>
       select tid,table_name,
       name,
       'sva_sgd_' || name as targetname
       from sx_fields where table_name ='sva_sgd'
       and currentlyused=1
      union
       select tid,table_name,
       name,
       'sva_pbe_aggr_' || name as targetname
       from sx_fields where table_name ='sva_pbe_aggr'
       and currentlyused=1
             
       order by 1

]]>
</sqlvar>
</sqlvars>

<#if sva_sgd_aggr_exists==1 && fact_table_source?exists >

<#assign  fact_table_target = {"name":"sva_pbe_aggr_sgd", "caption":"Stellen, Besetzungen, Personen"}
   />


CREATE temp table tmp_tables(
name CHAR(255) , 
caption CHAR(255) , 
description CHAR(255) , 
table_type CHAR(255) , 
systeminfo_id INTEGER  , 
systeminfo_orig INTEGER  , 
thema CHAR(255) , 
sachgebiete_id CHAR(255) 
);
CREATE temp TABLE tmp_fields(
tid serial NOT NULL,
table_name VARCHAR(255)  not null, 
name VARCHAR(255)  not null, 
caption VARCHAR(255) , 
description VARCHAR(255) , 
field_type VARCHAR(255)  not null, 
field_size VARCHAR(255)  , 
field_not_null smallint,
currentlyused SMALLINT , 
is_primarykey SMALLINT  default 0 , 
foreignkey_tab VARCHAR(255) , 
foreignkey_col VARCHAR(255) , 
foreignkey_int VARCHAR(255) , 
foreignkey_cap VARCHAR(255) , 
foreignkey_cond VARCHAR(255) , 
foreignkey_func VARCHAR(255) , 
check_integrity SMALLINT, 
is_sum SMALLINT  default 1,
foreignkey_uniquename VARCHAR(255)

);



update sx_fields set 
       is_sum=0
       where table_name='sva_sgd_aggr'
       and name!='vzae';
update sx_fields set 
       is_sum=1
       where table_name='sva_sgd_aggr'
       and name='vzae';
       
  
insert into tmp_tables (
name,
caption,
description,
table_type,
systeminfo_id,
thema,
sachgebiete_id
) 
select 
'${fact_table_target.name}',
'${fact_table_target.caption}',
description,
table_type,
systeminfo_id,
thema,
sachgebiete_id
from sx_tables where name='${fact_table_source}'
;


insert into tmp_fields (table_name,
       name,
       caption,
       description,
       field_type,
       field_size,
       field_not_null,
       currentlyused,
       is_primarykey,
       foreignkey_tab,
       foreignkey_col,
       foreignkey_int,
       foreignkey_cap,
       foreignkey_cond,
       foreignkey_func,
       check_integrity,
       is_sum,
       foreignkey_uniquename) 
select  '${fact_table_target.name}' as table_name,
       name,
       caption,
       description,
       field_type,
       field_size,
       field_not_null,
       currentlyused,
       is_primarykey,
       foreignkey_tab,
       foreignkey_col,
       foreignkey_int,
       foreignkey_cap,
       foreignkey_cond,
       foreignkey_func,
       check_integrity,
       is_sum,
       foreignkey_uniquename
       from sx_fields where table_name ='${fact_table_source}'
       and currentlyused=1;
<#foreach added_table in added_tables>
insert into tmp_fields (table_name,
       name,
       caption,
       description,
       field_type,
       field_size,
       field_not_null,
       currentlyused,
       is_primarykey,
       foreignkey_tab,
       foreignkey_col,
       foreignkey_int,
       foreignkey_cap,
       foreignkey_cond,
       foreignkey_func,
       check_integrity,
       is_sum,
       foreignkey_uniquename) 
select  '${fact_table_target.name}' as table_name,
       '${added_table.prefix}' || name,
       '${added_table.caption}: ' || caption,
       description,
       field_type,
       field_size,
       field_not_null,
       currentlyused,
       is_primarykey,
       foreignkey_tab,
       foreignkey_col,
       foreignkey_int,
       foreignkey_cap,
       foreignkey_cond,
       foreignkey_func,
       check_integrity,
       is_sum,
       foreignkey_uniquename
       from sx_fields where table_name ='${added_table.name}'
       and currentlyused=1;
</#foreach>

CREATE temp TABLE tmp_rpta_resultset
(
    caption        varchar(255),
   uniquename     varchar(255),
   fieldclause    text,
   joinclause     text,
   whereclause    text,
   systeminfo_id  integer
);

insert into tmp_rpta_resultset(caption,
       uniquename,
       systeminfo_id)
       select '${fact_table_target.caption}',
       '${fact_table_target.name}',
       6
;


update tmp_rpta_resultset set fieldclause='
<#foreach field_target in fields_target>
${field_target.table_name}.${field_target.name} as ${field_target.targetname},
</#foreach>
null::varchar as dummy',
joinclause='${fact_table_source}
<#foreach added_table in added_tables>
left outer join ${added_table.name} on (${added_table.joinclause})
</#foreach>';

select * into temp tmp_rs1 
from rpta_resultset
;

update rpta_resultset set caption=T.caption,
       fieldclause=T.fieldclause,
       joinclause=T.joinclause,
       whereclause=T.whereclause
       from tmp_rpta_resultset T
       where T.systeminfo_id=rpta_resultset.systeminfo_id
       and T.uniquename=rpta_resultset.uniquename
       ;

insert into rpta_resultset(caption,
       uniquename,
       fieldclause,
       joinclause,
       whereclause,
       systeminfo_id)
select caption,
       uniquename,
       fieldclause,
       joinclause,
       whereclause,
       systeminfo_id
       from tmp_rpta_resultset
       where 0=(select count(*) 
       from tmp_rs1 T
       where T.systeminfo_id=tmp_rpta_resultset.systeminfo_id
       and T.uniquename=tmp_rpta_resultset.uniquename)
       ;
drop table tmp_rpta_resultset;
drop table tmp_rs1;

delete from sx_tables where name
in (select T.name from tmp_tables  T);

insert into sx_tables (name,caption,description,table_type,systeminfo_id,systeminfo_orig,thema,sachgebiete_id)
select name,caption,description,table_type,systeminfo_id,systeminfo_orig,thema,sachgebiete_id
from tmp_tables;


delete from sx_fields where table_name
in (select T.table_name from tmp_fields T);

insert into sx_fields (table_name,name,caption,description,field_type,
field_size,
field_not_null,
currentlyUsed,
foreignkey_tab,
foreignkey_col,
foreignkey_cap,
foreignkey_int,
foreignkey_cond,
foreignkey_func,
check_integrity,
is_sum,
foreignkey_uniquename
)
select 
F.table_name,F.name,F.caption,F.description,F.field_type,
F.field_size,
F.field_not_null,
F.currentlyUsed,
F.foreignkey_tab,
F.foreignkey_col,
F.foreignkey_cap,
F.foreignkey_int,
F.foreignkey_cond,
F.foreignkey_func,
F.check_integrity,
F.is_sum,
F.foreignkey_uniquename

from tmp_fields F;


drop table tmp_fields;
drop table tmp_tables;


--rpta_column füllen:
select * into temp tmp_rc1
from rpta_column;


create temp table tmp_rpta_column(
 uniquename       varchar(255)   NOT NULL,
   caption          varchar(255),
   srcfieldname     varchar(255),
   column_type      integer,
   col_function     text,
   is_aggregate     smallint,
   resultset_id     integer,
   description      text,
   custom integer default 0
   );

insert into tmp_rpta_column(   uniquename,
       caption,
       srcfieldname,
       column_type,
       col_function,
       is_aggregate,
       resultset_id,
       description)
       select  F.name as  uniquename,
       coalesce(T.caption,T.name) || ' - ' || F.caption,
       F.name as srcfieldname,
       1 as column_type,
       (case when F.is_sum=1 then 'sum' else null::varchar end)  as col_function,
       (case when F.is_sum=1 then 1 else 0 end) as is_aggregate,
       R.tid as resultset_id,
       F.description
from rpta_resultset R, sx_fields F left outer join sx_tables T on (T.name=F.table_name) 
where F.table_name='${fact_table_target.name}'
and R.uniquename='${fact_table_target.name}'
and F.currentlyused=1
;

update rpta_column set 
       caption=T.caption,
       srcfieldname=T.srcfieldname,
       column_type=T.column_type,
       col_function=T.col_function,
       is_aggregate=T.is_aggregate,
       resultset_id=R.tid,
       description=T.description,
       custom=T.custom
       from tmp_rpta_column T, rpta_resultset R
where T.uniquename=rpta_column.uniquename
and rpta_column.resultset_id=R.tid
and R.uniquename='${fact_table_target.name}'
;
insert into rpta_column(   uniquename,
       caption,
       srcfieldname,
       column_type,
       col_function,
       is_aggregate,
       resultset_id,
       description,
       custom)
select T.uniquename,
T.caption,
T.srcfieldname,
T.column_type,
T.col_function,
T.is_aggregate,
R.tid as resultset_id,
T.description,
T.custom
       from tmp_rpta_column T, rpta_resultset R
       where R.uniquename='${fact_table_target.name}'
       and 0=(select count(*) from tmp_rc1 C
       where C.uniquename=T.uniquename
       and C.resultset_id=R.tid)
       ;

drop table tmp_rpta_column;
drop table tmp_rc1;

</#if> --wenn sva_sgd_aggr_exists=1
