You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2384 lines
120 KiB
2384 lines
120 KiB
package de.superx.bianalysis; |
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
import java.util.List; |
|
|
|
import org.junit.Before; |
|
import org.junit.Test; |
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import de.superx.BIATestUtils; |
|
import de.superx.BaseDbTest; |
|
import de.superx.bianalysis.models.Right; |
|
import de.superx.bianalysis.service.BiAnalysisManager; |
|
import de.superx.bianalysis.service.DbMetaAdapter; |
|
import de.superx.rest.model.Column; |
|
|
|
import static de.superx.BIATestUtils.getParsedSqlFromString; |
|
import static de.superx.BIATestUtils.getSqlFromReportDefinition; |
|
import static de.superx.BIATestUtils.getResultColumnsFromReport; |
|
|
|
public class ConformedTest extends BaseDbTest { |
|
|
|
@Autowired |
|
DbMetaAdapter dbAdapter; |
|
|
|
@Autowired |
|
BiAnalysisManager biAnalysisManager; |
|
|
|
@Before |
|
public void init() { |
|
setRight(Right.CREATE_ANALYSIS); |
|
} |
|
|
|
|
|
@Test |
|
public void twoFactTablesTwoJoinCriteriaUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "res_nom:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"res_nom:5", |
|
"res_nom:7" |
|
], |
|
"measureIds": [ |
|
"res_nom:17" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_patent:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "res_nom:4", |
|
"secondaryRolePlayingDimensionId": "res_patent:10" |
|
}, |
|
{ |
|
"leadingRolePlayingDimensionId": "res_nom:6", |
|
"secondaryRolePlayingDimensionId": "res_patent:78999" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_patent:28" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_prize_aggregated AS |
|
(SELECT nomination_date.year_actual AS year_actual_5, |
|
grouping(nomination_date.year_actual) AS g_year_actual_5, |
|
nomination_date.year_actual_sort_order AS year_actual_5_year_actual_sort_order, |
|
grouping(nomination_date.year_actual_sort_order) AS g_year_actual_5_year_actual_sort_order, |
|
awardee.gender AS gender_7, |
|
grouping(awardee.gender) AS g_gender_7, |
|
awardee.gender_sort_order AS gender_7_gender_sort_order, |
|
grouping(awardee.gender_sort_order) AS g_gender_7_gender_sort_order, |
|
COUNT(distinct(fact_prize.nomination_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_prize |
|
JOIN presentation.dim_person_researcher AS awardee ON fact_prize.person_id = awardee.id |
|
AND awardee.is_current = TRUE |
|
JOIN presentation.dim_date AS nomination_date ON fact_prize.nomination_date_id = nomination_date.id |
|
GROUP BY GROUPING |
|
SETS ((nomination_date.year_actual, nomination_date.year_actual_sort_order, awardee.gender, awardee.gender_sort_order), (nomination_date.year_actual, nomination_date.year_actual_sort_order), ()) |
|
ORDER BY nomination_date.year_actual_sort_order, awardee.gender_sort_order), |
|
fact_patent_aggregated AS |
|
(SELECT date_registration.year_actual AS year_actual_11, |
|
grouping(date_registration.year_actual) AS g_year_actual_11, |
|
date_registration.year_actual_sort_order AS year_actual_11_year_actual_sort_order, |
|
grouping(date_registration.year_actual_sort_order) AS g_year_actual_11_year_actual_sort_order, |
|
conformed_person.gender AS gender_79000, |
|
grouping(conformed_person.gender) AS g_gender_79000, |
|
conformed_person.gender_sort_order AS gender_79000_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_79000_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(distinct(fact_patent.id)) AS "col1" |
|
FROM presentation.fact_patent |
|
JOIN presentation.dim_date AS date_registration ON fact_patent.registration_date_id = date_registration.id |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_patent.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING SETS ((date_registration.year_actual, date_registration.year_actual_sort_order, conformed_person.gender, conformed_person.gender_sort_order), (date_registration.year_actual, date_registration.year_actual_sort_order), ()) |
|
ORDER BY date_registration.year_actual_sort_order, conformed_person.gender_sort_order) |
|
SELECT year_actual, |
|
year_actual_sort_order, |
|
gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT year_actual_11 AS year_actual, |
|
g_year_actual_11 AS g_year_actual, |
|
year_actual_11_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_11_year_actual_sort_order AS g_year_actual_sort_order, |
|
gender_79000 AS gender, |
|
g_gender_79000 AS g_gender, |
|
gender_79000_gender_sort_order AS gender_sort_order, |
|
g_gender_79000_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_patent_aggregated |
|
UNION ALL SELECT year_actual_5 AS year_actual, |
|
g_year_actual_5 AS g_year_actual, |
|
year_actual_5_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_5_year_actual_sort_order AS g_year_actual_sort_order, |
|
gender_7 AS gender, |
|
g_gender_7 AS g_gender, |
|
gender_7_gender_sort_order AS gender_sort_order, |
|
g_gender_7_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_prize_aggregated) x |
|
GROUP BY year_actual, g_year_actual, year_actual_sort_order, g_year_actual_sort_order, gender, g_gender, gender_sort_order, g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void twoFactTablesOneConformedAttributeUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:63" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:62", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:43" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT date.year_actual AS year_actual_63, |
|
grouping(date.year_actual) AS g_year_actual_63, |
|
date.year_actual_sort_order AS year_actual_63_year_actual_sort_order, |
|
grouping(date.year_actual_sort_order) AS g_year_actual_63_year_actual_sort_order, |
|
COUNT(distinct(fact_application.person_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_date AS date ON fact_application.receipt_date_id = date.id |
|
GROUP BY GROUPING |
|
SETS ((date.year_actual, |
|
date.year_actual_sort_order), ()) |
|
ORDER BY date.year_actual_sort_order), |
|
fact_doctoral_program_aggregated AS |
|
(SELECT date.year_actual AS year_actual_44, |
|
grouping(date.year_actual) AS g_year_actual_44, |
|
date.year_actual_sort_order AS year_actual_44_year_actual_sort_order, |
|
grouping(date.year_actual_sort_order) AS g_year_actual_44_year_actual_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(distinct(fact_doctoral_program.doctoral_candidate_person_id)) AS "col1" |
|
FROM presentation.fact_doctoral_program |
|
JOIN presentation.dim_date AS date ON fact_doctoral_program.admission_date_id = date.id |
|
GROUP BY GROUPING |
|
SETS ((date.year_actual, |
|
date.year_actual_sort_order), ()) |
|
ORDER BY date.year_actual_sort_order) |
|
SELECT year_actual, |
|
year_actual_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT year_actual_63 AS year_actual, |
|
g_year_actual_63 AS g_year_actual, |
|
year_actual_63_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_63_year_actual_sort_order AS g_year_actual_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT year_actual_44 AS year_actual, |
|
g_year_actual_44 AS g_year_actual, |
|
year_actual_44_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_44_year_actual_sort_order AS g_year_actual_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_doctoral_program_aggregated) x |
|
GROUP BY year_actual, |
|
g_year_actual, |
|
year_actual_sort_order, |
|
g_year_actual_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void twoFactTablesOneConformedAttributeOneAsymmetricAttributeUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:63", |
|
"app_basic:12" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:62", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:43" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT date.year_actual AS year_actual_63, |
|
grouping(date.year_actual) AS g_year_actual_63, |
|
date.year_actual_sort_order AS year_actual_63_year_actual_sort_order, |
|
grouping(date.year_actual_sort_order) AS g_year_actual_63_year_actual_sort_order, |
|
conformed_location.country AS country_12, |
|
grouping(conformed_location.country) AS g_country_12, |
|
COUNT(distinct(fact_application.person_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_date AS date ON fact_application.receipt_date_id = date.id |
|
JOIN presentation.dim_location AS conformed_location ON fact_application.location_lid = conformed_location.lid |
|
AND conformed_location.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((date.year_actual, |
|
date.year_actual_sort_order, |
|
conformed_location.country), (date.year_actual, |
|
date.year_actual_sort_order), ()) |
|
ORDER BY date.year_actual_sort_order, |
|
country_12), |
|
fact_doctoral_program_aggregated AS |
|
(SELECT date.year_actual AS year_actual_44, |
|
grouping(date.year_actual) AS g_year_actual_44, |
|
date.year_actual_sort_order AS year_actual_44_year_actual_sort_order, |
|
grouping(date.year_actual_sort_order) AS g_year_actual_44_year_actual_sort_order, |
|
NULL::text AS country_12, |
|
1 AS g_country_12, |
|
NULL::bigint AS "col0", |
|
COUNT(distinct(fact_doctoral_program.doctoral_candidate_person_id)) AS "col1" |
|
FROM presentation.fact_doctoral_program |
|
JOIN presentation.dim_date AS date ON fact_doctoral_program.admission_date_id = date.id |
|
GROUP BY GROUPING |
|
SETS ((date.year_actual, |
|
date.year_actual_sort_order), ()) |
|
ORDER BY date.year_actual_sort_order) |
|
SELECT year_actual, |
|
year_actual_sort_order, |
|
country, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT year_actual_63 AS year_actual, |
|
g_year_actual_63 AS g_year_actual, |
|
year_actual_63_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_63_year_actual_sort_order AS g_year_actual_sort_order, |
|
country_12 AS country, |
|
g_country_12 AS g_country, |
|
col0, |
|
col1 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT year_actual_44 AS year_actual, |
|
g_year_actual_44 AS g_year_actual, |
|
year_actual_44_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_44_year_actual_sort_order AS g_year_actual_sort_order, |
|
country_12 AS country, |
|
g_country_12 AS g_country, |
|
col0, |
|
col1 |
|
FROM fact_doctoral_program_aggregated) x |
|
GROUP BY year_actual, |
|
g_year_actual, |
|
year_actual_sort_order, |
|
g_year_actual_sort_order, |
|
country, |
|
g_country |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void threeFactTablesOneConformedAttributeUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
}, |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
|
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(distinct(fact_application.person_id)) AS "col0", |
|
NULL::bigint AS "col1", |
|
NULL::bigint AS "col2" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_doctoral_program_aggregated AS |
|
(SELECT conformed_person.gender AS gender_6, |
|
grouping(conformed_person.gender) AS g_gender_6, |
|
conformed_person.gender_sort_order AS gender_6_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_6_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(distinct(fact_doctoral_program.doctoral_candidate_person_id)) AS "col1", |
|
NULL::bigint AS "col2" |
|
FROM presentation.fact_doctoral_program |
|
JOIN presentation.dim_person_doctoral AS conformed_person ON fact_doctoral_program.doctoral_candidate_person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(distinct(fact_publication.publication_id)) AS "col2" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_6 AS gender, |
|
g_gender_6 AS g_gender, |
|
gender_6_gender_sort_order AS gender_sort_order, |
|
g_gender_6_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_doctoral_program_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void threeFactTablesTwoConformedAttributesUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3", |
|
"app_basic:142" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
}, |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
conformed_person.first_nationality AS first_nationality_142, |
|
grouping(conformed_person.first_nationality) AS g_first_nationality_142, |
|
COUNT(DISTINCT (fact_application.person_id)) AS "col0", |
|
NULL::bigint AS "col1", |
|
NULL::bigint AS "col2" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order, |
|
conformed_person.first_nationality), (conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order, |
|
first_nationality_142), |
|
fact_doctoral_program_aggregated AS |
|
(SELECT conformed_person.gender AS gender_6, |
|
grouping(conformed_person.gender) AS g_gender_6, |
|
conformed_person.gender_sort_order AS gender_6_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_6_gender_sort_order, |
|
conformed_person.first_nationality AS first_nationality_9, |
|
grouping(conformed_person.first_nationality) AS g_first_nationality_9, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT (fact_doctoral_program.doctoral_candidate_person_id)) AS "col1", |
|
NULL::bigint AS "col2" |
|
FROM presentation.fact_doctoral_program |
|
JOIN presentation.dim_person_doctoral AS conformed_person ON fact_doctoral_program.doctoral_candidate_person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order, |
|
conformed_person.first_nationality), (conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order, |
|
first_nationality_9), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
conformed_person.first_nationality AS first_nationality_21041, |
|
grouping(conformed_person.first_nationality) AS g_first_nationality_21041, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT (fact_publication.publication_id)) AS "col2" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order, |
|
conformed_person.first_nationality), (conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order, |
|
first_nationality_21041) |
|
SELECT gender, |
|
gender_sort_order, |
|
first_nationality, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
first_nationality_142 AS first_nationality, |
|
g_first_nationality_142 AS g_first_nationality, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_6 AS gender, |
|
g_gender_6 AS g_gender, |
|
gender_6_gender_sort_order AS gender_sort_order, |
|
g_gender_6_gender_sort_order AS g_gender_sort_order, |
|
first_nationality_9 AS first_nationality, |
|
g_first_nationality_9 AS g_first_nationality, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_doctoral_program_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
first_nationality_21041 AS first_nationality, |
|
g_first_nationality_21041 AS g_first_nationality, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order, |
|
first_nationality, |
|
g_first_nationality |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesOneConformedTopAttributeOneConformedLeftAttributeUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:142" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"app_basic:3" |
|
] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.first_nationality AS first_nationality_142, |
|
grouping(conformed_person.first_nationality) AS g_first_nationality_142, |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'männlich') AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'weiblich') AS "col2", |
|
NULL::bigint AS "col3", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'divers') AS "col4", |
|
NULL::bigint AS "col5", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'undefiniert / k.A.') AS "col6", |
|
NULL::bigint AS "col7" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.first_nationality), ()) |
|
ORDER BY first_nationality_142), |
|
fact_doctoral_program_aggregated AS |
|
(SELECT conformed_person.first_nationality AS first_nationality_9, |
|
grouping(conformed_person.first_nationality) AS g_first_nationality_9, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'männlich') AS "col1", |
|
NULL::bigint AS "col2", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'weiblich') AS "col3", |
|
NULL::bigint AS "col4", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'divers') AS "col5", |
|
NULL::bigint AS "col6", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'undefiniert / k.A.') AS "col7" |
|
FROM presentation.fact_doctoral_program |
|
JOIN presentation.dim_person_doctoral AS conformed_person ON fact_doctoral_program.doctoral_candidate_person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.first_nationality), ()) |
|
ORDER BY first_nationality_9) |
|
SELECT first_nationality, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2, |
|
SUM(col3) AS col3, |
|
SUM(col4) AS col4, |
|
SUM(col5) AS col5, |
|
SUM(col6) AS col6, |
|
SUM(col7) AS col7 |
|
FROM |
|
(SELECT first_nationality_142 AS first_nationality, |
|
g_first_nationality_142 AS g_first_nationality, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5, |
|
col6, |
|
col7 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT first_nationality_9 AS first_nationality, |
|
g_first_nationality_9 AS g_first_nationality, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5, |
|
col6, |
|
col7 |
|
FROM fact_doctoral_program_aggregated) x |
|
GROUP BY first_nationality, |
|
g_first_nationality |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesOneConformedTopAttributeOneConformedLeftAttributeLeftJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:142" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "left", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"app_basic:3" |
|
] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
SELECT conformed_person.first_nationality AS first_nationality_142, |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'n. v.') AS "col0", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'n. v.') AS "col1", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'männlich') AS "col2", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'männlich') AS "col3", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'weiblich') AS "col4", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'weiblich') AS "col5", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'divers') AS "col6", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'divers') AS "col7", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.gender = 'undefiniert / k.A.') AS "col8", |
|
COUNT(DISTINCT fact_doctoral_program.doctoral_candidate_person_id) FILTER ( WHERE conformed_person.gender = 'undefiniert / k.A.') AS "col9" |
|
FROM presentation.fact_application |
|
LEFT JOIN |
|
(SELECT DISTINCT doctoral_candidate_person_id |
|
FROM presentation.fact_doctoral_program) AS fact_doctoral_program ON fact_doctoral_program.doctoral_candidate_person_id = fact_application.person_id |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.first_nationality), ()) |
|
ORDER BY first_nationality_142 |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesOneConformedAttributeLeftJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "left", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:56" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
""" ; |
|
|
|
String expectedSql = """ |
|
SELECT conformed_person.gender AS gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
COUNT(distinct(fact_application.person_id)) AS "col0", |
|
COUNT(distinct(fact_doctoral_program.doctoral_program_id)) AS "col1" |
|
FROM presentation.fact_application |
|
LEFT JOIN |
|
(SELECT DISTINCT doctoral_candidate_person_id, |
|
doctoral_program_id |
|
FROM presentation.fact_doctoral_program) AS fact_doctoral_program ON fact_doctoral_program.doctoral_candidate_person_id = fact_application.person_id |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void threeFactTablesOneConformedAttributeOneLeftJoinOneunion() { |
|
|
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "left", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:56" |
|
] |
|
}, |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(distinct(fact_application.person_id)) AS "col0", |
|
COUNT(distinct(fact_doctoral_program.doctoral_program_id)) AS "col1", |
|
NULL::bigint AS "col2" |
|
FROM presentation.fact_application |
|
LEFT JOIN |
|
(SELECT DISTINCT doctoral_candidate_person_id, |
|
doctoral_program_id |
|
FROM presentation.fact_doctoral_program) AS fact_doctoral_program ON fact_doctoral_program.doctoral_candidate_person_id = fact_application.person_id |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(distinct(fact_publication.publication_id)) AS "col2" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesTwoConformedAttributesUnionJoin() { |
|
|
|
String json = """ |
|
{ |
|
"factTableId": "res_nom:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"res_nom:5", |
|
"res_nom:7" |
|
], |
|
"measureIds": [ |
|
"res_nom:17" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_patent:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "res_nom:4", |
|
"secondaryRolePlayingDimensionId": "res_patent:10" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_patent:28" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_prize_aggregated AS |
|
(SELECT nomination_date.year_actual AS year_actual_5, |
|
grouping(nomination_date.year_actual) AS g_year_actual_5, |
|
nomination_date.year_actual_sort_order AS year_actual_5_year_actual_sort_order, |
|
grouping(nomination_date.year_actual_sort_order) AS g_year_actual_5_year_actual_sort_order, |
|
awardee.gender AS gender_7, |
|
grouping(awardee.gender) AS g_gender_7, |
|
awardee.gender_sort_order AS gender_7_gender_sort_order, |
|
grouping(awardee.gender_sort_order) AS g_gender_7_gender_sort_order, |
|
COUNT(DISTINCT (fact_prize.nomination_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_prize |
|
JOIN presentation.dim_person_researcher AS awardee ON fact_prize.person_id = awardee.id |
|
AND awardee.is_current = TRUE |
|
JOIN presentation.dim_date AS nomination_date ON fact_prize.nomination_date_id = nomination_date.id |
|
GROUP BY GROUPING |
|
SETS ((nomination_date.year_actual, |
|
nomination_date.year_actual_sort_order, |
|
awardee.gender, awardee.gender_sort_order), (nomination_date.year_actual, |
|
nomination_date.year_actual_sort_order), ()) |
|
ORDER BY nomination_date.year_actual_sort_order, |
|
awardee.gender_sort_order), |
|
fact_patent_aggregated AS |
|
(SELECT date_registration.year_actual AS year_actual_11, |
|
grouping(date_registration.year_actual) AS g_year_actual_11, |
|
date_registration.year_actual_sort_order AS year_actual_11_year_actual_sort_order, |
|
grouping(date_registration.year_actual_sort_order) AS g_year_actual_11_year_actual_sort_order, |
|
NULL::text AS gender_7, |
|
1 AS g_gender_7, |
|
NULL::bigint AS gender_7_gender_sort_order, |
|
1 AS g_gender_7_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT (fact_patent.id)) AS "col1" |
|
FROM presentation.fact_patent |
|
JOIN presentation.dim_date AS date_registration ON fact_patent.registration_date_id = date_registration.id |
|
GROUP BY GROUPING |
|
SETS ((date_registration.year_actual, |
|
date_registration.year_actual_sort_order), ()) |
|
ORDER BY date_registration.year_actual_sort_order) |
|
SELECT year_actual, |
|
year_actual_sort_order, |
|
gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT year_actual_11 AS year_actual, |
|
g_year_actual_11 AS g_year_actual, |
|
year_actual_11_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_11_year_actual_sort_order AS g_year_actual_sort_order, |
|
gender_7 AS gender, |
|
g_gender_7 AS g_gender, |
|
gender_7_gender_sort_order AS gender_sort_order, |
|
g_gender_7_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_patent_aggregated |
|
UNION ALL SELECT year_actual_5 AS year_actual, |
|
g_year_actual_5 AS g_year_actual, |
|
year_actual_5_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_5_year_actual_sort_order AS g_year_actual_sort_order, |
|
gender_7 AS gender, |
|
g_gender_7 AS g_gender, |
|
gender_7_gender_sort_order AS gender_sort_order, |
|
g_gender_7_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_prize_aggregated) x |
|
GROUP BY year_actual, |
|
g_year_actual, |
|
year_actual_sort_order, |
|
g_year_actual_sort_order, |
|
gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesWithFilterUnionJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [ |
|
{ |
|
"dimensionAttributeId": "app_basic:3", |
|
"filterValues": [ |
|
"männlich" |
|
] |
|
} |
|
], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:82" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_habilitation:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_habilitation:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_habilitation:45" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(fact_application.requestsubject_id) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
WHERE conformed_person.gender IN ('männlich') |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_habilitation_aggregated AS |
|
(SELECT conformed_person.gender AS gender_6, |
|
grouping(conformed_person.gender) AS g_gender_6, |
|
conformed_person.gender_sort_order AS gender_6_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_6_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(distinct(fact_habilitation.person_id)) AS "col1" |
|
FROM presentation.fact_habilitation |
|
JOIN presentation.dim_person_doctoral AS conformed_person ON fact_habilitation.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
WHERE conformed_person.gender IN ('männlich') |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_6 AS gender, |
|
g_gender_6 AS g_gender, |
|
gender_6_gender_sort_order AS gender_sort_order, |
|
g_gender_6_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_habilitation_aggregated) x |
|
GROUP BY gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesWithSortOrderColumnAsNullAttribute() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:6" |
|
], |
|
"measureIds": [ |
|
"app_basic:82" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_habilitation:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_habilitation:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_habilitation:45" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
|
|
""" ; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT age_semester_start.age AS age_6, |
|
grouping(age_semester_start.age) AS g_age_6, |
|
age_semester_start.id AS age_6_id, |
|
grouping(age_semester_start.id) AS g_age_6_id, |
|
COUNT(fact_application.requestsubject_id) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_age AS age_semester_start ON fact_application.age_semester_start_id = age_semester_start.id |
|
GROUP BY GROUPING |
|
SETS ((age_semester_start.age, |
|
age_semester_start.id), ()) |
|
ORDER BY age_semester_start.id), |
|
fact_habilitation_aggregated AS |
|
(SELECT NULL::text AS age_6, |
|
1 AS g_age_6, |
|
NULL::bigint AS age_6_id, |
|
1 AS g_age_6_id, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_habilitation |
|
GROUP BY GROUPING |
|
SETS (())) |
|
SELECT age, |
|
id, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT age_6 AS age, |
|
g_age_6 AS g_age, |
|
age_6_id AS id, |
|
g_age_6_id AS g_id, |
|
col0, |
|
col1 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT age_6 AS age, |
|
g_age_6 AS g_age, |
|
age_6_id AS id, |
|
g_age_6_id AS g_id, |
|
col0, |
|
col1 |
|
FROM fact_habilitation_aggregated) x |
|
GROUP BY age, |
|
g_age, |
|
id, |
|
g_id |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void twoFactTablesWithFirstAttributeNullAttributeAndFollowingNonNullAttributes() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:6", |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:82" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_habilitation:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_habilitation:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_habilitation:45" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT age_semester_start.age AS age_6, |
|
grouping(age_semester_start.age) AS g_age_6, |
|
age_semester_start.id AS age_6_id, |
|
grouping(age_semester_start.id) AS g_age_6_id, |
|
conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(fact_application.requestsubject_id) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_age AS age_semester_start ON fact_application.age_semester_start_id = age_semester_start.id |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((age_semester_start.age, |
|
age_semester_start.id, |
|
conformed_person.gender, conformed_person.gender_sort_order), (age_semester_start.age, |
|
age_semester_start.id), ()) |
|
ORDER BY age_semester_start.id, |
|
conformed_person.gender_sort_order), |
|
fact_habilitation_aggregated AS |
|
(SELECT NULL::text AS age_6, |
|
1 AS g_age_6, |
|
NULL::bigint AS age_6_id, |
|
1 AS g_age_6_id, |
|
NULL::text AS gender_6, |
|
1 AS g_gender_6, |
|
NULL::bigint AS gender_6_gender_sort_order, |
|
1 AS g_gender_6_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_habilitation |
|
GROUP BY GROUPING |
|
SETS (())) |
|
SELECT age, |
|
id, |
|
gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT age_6 AS age, |
|
g_age_6 AS g_age, |
|
age_6_id AS id, |
|
g_age_6_id AS g_id, |
|
gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT age_6 AS age, |
|
g_age_6 AS g_age, |
|
age_6_id AS id, |
|
g_age_6_id AS g_id, |
|
gender_6 AS gender, |
|
g_gender_6 AS g_gender, |
|
gender_6_gender_sort_order AS gender_sort_order, |
|
g_gender_6_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_habilitation_aggregated) x |
|
GROUP BY age, |
|
g_age, |
|
id, |
|
g_id, |
|
gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void twoFactTablesWithOneConformedRowAttributeAndOneAsymmetricColumnAttributeOuterJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "res_pub:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"res_pub:38" |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_nom:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "res_pub:37", |
|
"secondaryRolePlayingDimensionId": "res_nom:4" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_nom:17" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"res_pub:21048" |
|
] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_publication_aggregated AS |
|
(SELECT date.year_actual AS year_actual_38, |
|
grouping(date.year_actual) AS g_year_actual_38, |
|
date.year_actual_sort_order AS year_actual_38_year_actual_sort_order, |
|
grouping(date.year_actual_sort_order) AS g_year_actual_38_year_actual_sort_order, |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_publication.peer_reviewed = 'n. v.') AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_publication.peer_reviewed = 'ja') AS "col2", |
|
NULL::bigint AS "col3", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_publication.peer_reviewed = 'nein') AS "col4", |
|
NULL::bigint AS "col5" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_date AS date ON fact_publication.publication_date_id = date.id |
|
JOIN presentation.dim_publication AS conformed_publication ON fact_publication.publication_id = conformed_publication.id |
|
GROUP BY GROUPING |
|
SETS ((date.year_actual, |
|
date.year_actual_sort_order), ()) |
|
ORDER BY date.year_actual_sort_order), |
|
fact_prize_aggregated AS |
|
(SELECT nomination_date.year_actual AS year_actual_5, |
|
grouping(nomination_date.year_actual) AS g_year_actual_5, |
|
nomination_date.year_actual_sort_order AS year_actual_5_year_actual_sort_order, |
|
grouping(nomination_date.year_actual_sort_order) AS g_year_actual_5_year_actual_sort_order, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1", |
|
NULL::bigint AS "col2", |
|
NULL::bigint AS "col3", |
|
NULL::bigint AS "col4", |
|
NULL::bigint AS "col5" |
|
FROM presentation.fact_prize |
|
JOIN presentation.dim_date AS nomination_date ON fact_prize.nomination_date_id = nomination_date.id |
|
GROUP BY GROUPING |
|
SETS ((nomination_date.year_actual, |
|
nomination_date.year_actual_sort_order), ()) |
|
ORDER BY nomination_date.year_actual_sort_order) |
|
SELECT year_actual, |
|
year_actual_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2, |
|
SUM(col3) AS col3, |
|
SUM(col4) AS col4, |
|
SUM(col5) AS col5 |
|
FROM |
|
(SELECT year_actual_38 AS year_actual, |
|
g_year_actual_38 AS g_year_actual, |
|
year_actual_38_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_38_year_actual_sort_order AS g_year_actual_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_publication_aggregated |
|
UNION ALL SELECT year_actual_5 AS year_actual, |
|
g_year_actual_5 AS g_year_actual, |
|
year_actual_5_year_actual_sort_order AS year_actual_sort_order, |
|
g_year_actual_5_year_actual_sort_order AS g_year_actual_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_prize_aggregated) x |
|
GROUP BY year_actual, |
|
g_year_actual, |
|
year_actual_sort_order, |
|
g_year_actual_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesWithTopAttributesWithDifferentValuesOuterJoin() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"app_basic:144" |
|
] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'n. v.') AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col2", |
|
NULL::bigint AS "col3", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col4", |
|
NULL::bigint AS "col5" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'n. v.') AS "col1", |
|
NULL::bigint AS "col2", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col3", |
|
NULL::bigint AS "col4", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col5" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2, |
|
SUM(col3) AS col3, |
|
SUM(col4) AS col4, |
|
SUM(col5) AS col5 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
|
|
} |
|
|
|
@Test |
|
public void twoFactTablesTwoFilterForTopAndRowAttributes() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [ |
|
{ |
|
"dimensionAttributeId": "app_basic:3", |
|
"filterValues": [ |
|
"männlich", |
|
"weiblich" |
|
] |
|
}, |
|
{ |
|
"dimensionAttributeId": "app_basic:144", |
|
"filterValues": [ |
|
"Ja", |
|
"Nein" |
|
] |
|
} |
|
], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"app_basic:144" |
|
] |
|
} |
|
|
|
""" ; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col2", |
|
NULL::bigint AS "col3" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
WHERE conformed_person.gender IN ('männlich', 'weiblich') |
|
AND conformed_person.german IN ('Ja', 'Nein') |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col1", |
|
NULL::bigint AS "col2", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col3" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
WHERE conformed_person.gender IN ('männlich', 'weiblich') |
|
AND conformed_person.german IN ('Ja', 'Nein') |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2, |
|
SUM(col3) AS col3 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, g_gender, gender_sort_order, g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void totalsColumnTwoFactTablesOneTopOneLeftAttribute() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"app_basic:144" |
|
] |
|
} |
|
|
|
""" ; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'n. v.') AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col2", |
|
NULL::bigint AS "col3", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col4", |
|
NULL::bigint AS "col5" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'n. v.') AS "col1", |
|
NULL::bigint AS "col2", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col3", |
|
NULL::bigint AS "col4", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col5" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2, |
|
SUM(col3) AS col3, |
|
SUM(col4) AS col4, |
|
SUM(col5) AS col5 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, g_gender, gender_sort_order, g_gender_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void twoFactTablesWithOneSymmetricOneAsymmetricLeftAttributeOneConformedTopAttribute() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:3", |
|
"app_basic:12" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_pub:21020" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"app_basic:144" |
|
] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT conformed_person.gender AS gender_3, |
|
grouping(conformed_person.gender) AS g_gender_3, |
|
conformed_person.gender_sort_order AS gender_3_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_3_gender_sort_order, |
|
conformed_location.country AS country_12, |
|
grouping(conformed_location.country) AS g_country_12, |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'n. v.') AS "col0", |
|
NULL::bigint AS "col1", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col2", |
|
NULL::bigint AS "col3", |
|
COUNT(DISTINCT fact_application.person_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col4", |
|
NULL::bigint AS "col5" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_person_applicant AS conformed_person ON fact_application.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
JOIN presentation.dim_location AS conformed_location ON fact_application.location_lid = conformed_location.lid |
|
AND conformed_location.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order, |
|
conformed_location.country), (conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order, |
|
country_12), |
|
fact_publication_aggregated AS |
|
(SELECT conformed_person.gender AS gender_21021, |
|
grouping(conformed_person.gender) AS g_gender_21021, |
|
conformed_person.gender_sort_order AS gender_21021_gender_sort_order, |
|
grouping(conformed_person.gender_sort_order) AS g_gender_21021_gender_sort_order, |
|
NULL::text AS country_12, |
|
1 AS g_country_12, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'n. v.') AS "col1", |
|
NULL::bigint AS "col2", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Ja') AS "col3", |
|
NULL::bigint AS "col4", |
|
COUNT(DISTINCT fact_publication.publication_id) FILTER ( WHERE conformed_person.german = 'Nein') AS "col5" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_person_researcher AS conformed_person ON fact_publication.person_id = conformed_person.id |
|
AND conformed_person.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((conformed_person.gender, conformed_person.gender_sort_order), ()) |
|
ORDER BY conformed_person.gender_sort_order) |
|
SELECT gender, |
|
gender_sort_order, |
|
country, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1, |
|
SUM(col2) AS col2, |
|
SUM(col3) AS col3, |
|
SUM(col4) AS col4, |
|
SUM(col5) AS col5 |
|
FROM |
|
(SELECT gender_3 AS gender, |
|
g_gender_3 AS g_gender, |
|
gender_3_gender_sort_order AS gender_sort_order, |
|
g_gender_3_gender_sort_order AS g_gender_sort_order, |
|
country_12 AS country, |
|
g_country_12 AS g_country, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT gender_21021 AS gender, |
|
g_gender_21021 AS g_gender, |
|
gender_21021_gender_sort_order AS gender_sort_order, |
|
g_gender_21021_gender_sort_order AS g_gender_sort_order, |
|
country_12 AS country, |
|
g_country_12 AS g_country, |
|
col0, |
|
col1, |
|
col2, |
|
col3, |
|
col4, |
|
col5 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY gender, |
|
g_gender, |
|
gender_sort_order, |
|
g_gender_sort_order, |
|
country, |
|
g_country |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
|
|
@Test |
|
public void testConformedWithHiddenEmptyColumns() throws Exception { |
|
String json = """ |
|
{ |
|
"factTableId": "res_nom:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"res_nom:79102", |
|
"res_nom:79101" |
|
], |
|
"measureIds": [ |
|
"res_nom:17" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_infra:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "res_nom:4", |
|
"secondaryRolePlayingDimensionId": "res_infra:34" |
|
}, |
|
{ |
|
"leadingRolePlayingDimensionId": "res_nom:79090", |
|
"secondaryRolePlayingDimensionId": "res_infra:79074" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_infra:16" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [ |
|
"res_nom:5" |
|
] |
|
} |
|
"""; |
|
|
|
String expectedColumnsJson = """ |
|
{ |
|
"columns": [ |
|
{ |
|
"field": "res_nom:79102", |
|
"header": "Typ" |
|
}, |
|
{ |
|
"field": "res_nom:79101", |
|
"header": "Name Organisationseinheit" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|n. v. || Kennzahl|res_nom:17", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|n. v. || Kennzahl|Preisanerkennungen [Anzahl] (PR)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|n. v. || Kennzahl|res_infra:16", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|n. v. || Kennzahl|Forschungsinfrastruktur [Anzahl] (FI)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2023 || Kennzahl|res_nom:17", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2023 || Kennzahl|Preisanerkennungen [Anzahl] (PR)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2023 || Kennzahl|res_infra:16", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2023 || Kennzahl|Forschungsinfrastruktur [Anzahl] (FI)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2024 || Kennzahl|res_nom:17", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2024 || Kennzahl|Preisanerkennungen [Anzahl] (PR)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2024 || Kennzahl|res_infra:16", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2024 || Kennzahl|Forschungsinfrastruktur [Anzahl] (FI)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2025 || Kennzahl|res_nom:17", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2025 || Kennzahl|Preisanerkennungen [Anzahl] (PR)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2025 || Kennzahl|res_infra:16", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2025 || Kennzahl|Forschungsinfrastruktur [Anzahl] (FI)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2026 || Kennzahl|res_nom:17", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2026 || Kennzahl|Preisanerkennungen [Anzahl] (PR)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|2026 || Kennzahl|res_infra:16", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung|2026 || Kennzahl|Forschungsinfrastruktur [Anzahl] (FI)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|Gesamt || Kennzahl|res_nom:17", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung| Gesamt || Kennzahl|Preisanerkennungen [Anzahl] (PR)" |
|
}, |
|
{ |
|
"field": "conf:49: conf:50|Gesamt || Kennzahl|res_infra:16", |
|
"header": "Jahr der Auszeichnung: Jahr der Auszeichnung| Gesamt || Kennzahl|Forschungsinfrastruktur [Anzahl] (FI)" |
|
} |
|
] |
|
} |
|
"""; |
|
|
|
List<Column> actualColumns = getResultColumnsFromReport(json, dbAdapter, biAnalysisManager); |
|
List<Column> expectedColumns = BIATestUtils.parseColumns(expectedColumnsJson); |
|
|
|
assertEquals("Column list size differs", expectedColumns.size(), actualColumns.size()); |
|
for (int i = 0; i < expectedColumns.size(); i++) { |
|
Column expected = expectedColumns.get(i); |
|
Column actual = actualColumns.get(i); |
|
assertEquals("Field differs at index " + i, expected.field, actual.field); |
|
assertEquals("Header differs at index " + i, expected.header, actual.header); |
|
} |
|
} |
|
|
|
|
|
@Test |
|
public void testCriteriaGroupWithUnion() { |
|
String json = """ |
|
{ |
|
"factTableId": "app_basic:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"app_basic:12393" |
|
], |
|
"measureIds": [ |
|
"app_basic:80" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_doctoral_program:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "app_basic:2", |
|
"secondaryRolePlayingDimensionId": "res_doctoral_program:3" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_doctoral_program:57" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_application_aggregated AS |
|
(SELECT age_semester_start.age_category_his AS age_category_his_12393, |
|
grouping(age_semester_start.age_category_his) AS g_age_category_his_12393, |
|
age_semester_start.age_category_his_sort_order AS age_category_his_12393_age_category_his_sort_order, |
|
grouping(age_semester_start.age_category_his_sort_order) AS g_age_category_his_12393_age_category_his_sort_order, |
|
COUNT(DISTINCT (fact_application.person_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_application |
|
JOIN presentation.dim_age AS age_semester_start ON fact_application.age_semester_start_id = age_semester_start.id |
|
GROUP BY GROUPING |
|
SETS ((age_semester_start.age_category_his, |
|
age_semester_start.age_category_his_sort_order), ()) |
|
ORDER BY age_semester_start.age_category_his_sort_order), |
|
fact_doctoral_program_aggregated AS |
|
(SELECT NULL::text AS age_category_his_12393, |
|
1 AS g_age_category_his_12393, |
|
NULL::bigint AS age_category_his_12393_age_category_his_sort_order, |
|
1 AS g_age_category_his_12393_age_category_his_sort_order, |
|
NULL::bigint AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_doctoral_program |
|
GROUP BY GROUPING |
|
SETS (())) |
|
SELECT age_category_his, |
|
age_category_his_sort_order, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT age_category_his_12393 AS age_category_his, |
|
g_age_category_his_12393 AS g_age_category_his, |
|
age_category_his_12393_age_category_his_sort_order AS age_category_his_sort_order, |
|
g_age_category_his_12393_age_category_his_sort_order AS g_age_category_his_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_application_aggregated |
|
UNION ALL SELECT age_category_his_12393 AS age_category_his, |
|
g_age_category_his_12393 AS g_age_category_his, |
|
age_category_his_12393_age_category_his_sort_order AS age_category_his_sort_order, |
|
g_age_category_his_12393_age_category_his_sort_order AS g_age_category_his_sort_order, |
|
col0, |
|
col1 |
|
FROM fact_doctoral_program_aggregated) x |
|
GROUP BY age_category_his, |
|
g_age_category_his, |
|
age_category_his_sort_order, |
|
g_age_category_his_sort_order |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void testWithFirstTwoLeftAttributesNonNullAndLastAttributeNull() { |
|
String json = """ |
|
{ |
|
"factTableId": "res:66", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"res:79093", |
|
"res:619", |
|
"res:627" |
|
], |
|
"measureIds": [ |
|
"res:104" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_pub:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "res:79091", |
|
"secondaryRolePlayingDimensionId": "res_pub:79096" |
|
}, |
|
{ |
|
"leadingRolePlayingDimensionId": "res:618", |
|
"secondaryRolePlayingDimensionId": "res_pub:2" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_project_aggregated AS |
|
(SELECT orgunit_project_person_flat.orgunittype AS orgunittype_79093, |
|
grouping(orgunit_project_person_flat.orgunittype) AS g_orgunittype_79093, |
|
project_publication.title AS title_619, |
|
grouping(project_publication.title) AS g_title_619, |
|
project.project_name AS project_name_627, |
|
grouping(project.project_name) AS g_project_name_627, |
|
COUNT(DISTINCT (fact_project.project_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM presentation.fact_project |
|
JOIN presentation.dim_orgunit_flat AS orgunit_project_person_flat ON fact_project.orgunit_project_person_lid = orgunit_project_person_flat.lid |
|
AND orgunit_project_person_flat.is_current = TRUE |
|
JOIN presentation.dim_project AS project ON fact_project.project_id = project.id |
|
JOIN presentation.dim_publication AS project_publication ON fact_project.publication_id = project_publication.id |
|
GROUP BY GROUPING |
|
SETS ((orgunit_project_person_flat.orgunittype, |
|
project_publication.title, |
|
project.project_name), (orgunit_project_person_flat.orgunittype, |
|
project_publication.title), (orgunit_project_person_flat.orgunittype), ()) |
|
ORDER BY orgunittype_79093, |
|
title_619, |
|
project_name_627), |
|
fact_publication_aggregated AS |
|
( |
|
SELECT creator_orgunit_flat.orgunittype AS orgunittype_79098, |
|
grouping(creator_orgunit_flat.orgunittype) AS g_orgunittype_79098, |
|
conformed_publication.title AS title_21047, |
|
grouping(conformed_publication.title) AS g_title_21047, |
|
NULL::text AS project_name_627, |
|
1 AS g_project_name_627, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT (fact_publication.publication_id)) AS "col1" |
|
FROM presentation.fact_publication |
|
JOIN presentation.dim_publication AS conformed_publication ON fact_publication.publication_id = conformed_publication.id |
|
JOIN presentation.dim_orgunit_flat AS creator_orgunit_flat ON fact_publication.creator_orgunit_lid = creator_orgunit_flat.lid |
|
AND creator_orgunit_flat.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((creator_orgunit_flat.orgunittype, |
|
conformed_publication.title), (creator_orgunit_flat.orgunittype), ()) |
|
ORDER BY orgunittype_79098, |
|
title_21047 |
|
) |
|
SELECT orgunittype, |
|
title, |
|
project_name, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT orgunittype_79093 AS orgunittype, |
|
g_orgunittype_79093 AS g_orgunittype, |
|
title_619 AS title, |
|
g_title_619 AS g_title, |
|
project_name_627 AS project_name, |
|
g_project_name_627 AS g_project_name, |
|
col0, |
|
col1 |
|
FROM fact_project_aggregated |
|
UNION ALL SELECT orgunittype_79098 AS orgunittype, |
|
g_orgunittype_79098 AS g_orgunittype, |
|
title_21047 AS title, |
|
g_title_21047 AS g_title, |
|
project_name_627 AS project_name, |
|
g_project_name_627 AS g_project_name, |
|
col0, |
|
col1 |
|
FROM fact_publication_aggregated) x |
|
GROUP BY orgunittype, |
|
g_orgunittype, |
|
title, |
|
g_title, |
|
project_name, |
|
g_project_name |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
|
|
@Test |
|
public void testRightReplacementForUnion() { |
|
String json = """ |
|
{ |
|
"factTableId": "res_pub:1", |
|
"filters": [], |
|
"hideEmptyColumns": false, |
|
"leftDimensionAttributeIds": [ |
|
"res_pub:79097" |
|
], |
|
"measureIds": [ |
|
"res_pub:21037" |
|
], |
|
"secondaryFacttables": [ |
|
{ |
|
"factId": "res_nom:1", |
|
"join": "union", |
|
"joinCriterias": [ |
|
{ |
|
"leadingRolePlayingDimensionId": "res_pub:79096", |
|
"secondaryRolePlayingDimensionId": "res_nom:79090" |
|
} |
|
], |
|
"measureIds": [ |
|
"res_nom:17" |
|
] |
|
} |
|
], |
|
"topDimensionAttributeIds": [] |
|
} |
|
"""; |
|
|
|
String expectedSql = """ |
|
WITH fact_publication_aggregated AS |
|
(SELECT creator_orgunit_flat.orgunit_name AS orgunit_name_79097, |
|
grouping(creator_orgunit_flat.orgunit_name) AS g_orgunit_name_79097, |
|
COUNT(DISTINCT (fact_publication.publication_id)) AS "col0", |
|
NULL::bigint AS "col1" |
|
FROM (SELECT * FROM presentation.fact_publication) AS fact_publication |
|
JOIN presentation.dim_orgunit_flat AS creator_orgunit_flat ON fact_publication.creator_orgunit_lid = creator_orgunit_flat.lid |
|
AND creator_orgunit_flat.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((creator_orgunit_flat.orgunit_name), ()) |
|
ORDER BY orgunit_name_79097), |
|
fact_prize_aggregated AS |
|
(SELECT orgunit_intern_flat.orgunit_name AS orgunit_name_79101, |
|
grouping(orgunit_intern_flat.orgunit_name) AS g_orgunit_name_79101, |
|
NULL::bigint AS "col0", |
|
COUNT(DISTINCT (fact_prize.nomination_id)) AS "col1" |
|
FROM (SELECT * FROM presentation.fact_prize) AS fact_prize |
|
JOIN presentation.dim_orgunit_flat AS orgunit_intern_flat ON fact_prize.orgunit_intern_lid = orgunit_intern_flat.lid |
|
AND orgunit_intern_flat.is_current = TRUE |
|
GROUP BY GROUPING |
|
SETS ((orgunit_intern_flat.orgunit_name), ()) |
|
ORDER BY orgunit_name_79101) |
|
SELECT orgunit_name, |
|
SUM(col0) AS col0, |
|
SUM(col1) AS col1 |
|
FROM |
|
(SELECT orgunit_name_79097 AS orgunit_name, |
|
g_orgunit_name_79097 AS g_orgunit_name, |
|
col0, |
|
col1 |
|
FROM fact_publication_aggregated |
|
UNION ALL SELECT orgunit_name_79101 AS orgunit_name, |
|
g_orgunit_name_79101 AS g_orgunit_name, |
|
col0, |
|
col1 |
|
FROM fact_prize_aggregated) x |
|
GROUP BY orgunit_name, |
|
g_orgunit_name |
|
"""; |
|
|
|
String actualSqlParsed = getSqlFromReportDefinition(json, dbAdapter); |
|
actualSqlParsed = dbAdapter.applyAccessRestrictions(actualSqlParsed); |
|
|
|
String expectedSqlParsed = getParsedSqlFromString(expectedSql); |
|
|
|
assertEquals(expectedSqlParsed, actualSqlParsed); |
|
} |
|
} |