[improvement][headless]Add company demo schema and data to integration test.

[improvement][headless]Clean code logic of headless translator.
This commit is contained in:
jerryjzhang
2024-11-25 21:35:13 +08:00
parent 860fd5d299
commit 91b16f95ff
8 changed files with 1193 additions and 1108 deletions

View File

@@ -59,38 +59,42 @@ public class DefaultSemanticTranslator implements SemanticTranslator {
SqlQueryParam sqlQueryParam = queryStatement.getSqlQueryParam();
log.info("parse with ontology: [{}]", ontologyQueryParam);
ComponentFactory.getQueryParser().parse(queryStatement);
String ontologyQueryTable = sqlQueryParam.getTable();
String ontologyQuerySql = sqlQueryParam.getSql();
String ontologySql = queryStatement.getSql();
if (!queryStatement.isOk()) {
throw new Exception(String.format("parse table [%s] error [%s]",
sqlQueryParam.getTable(), queryStatement.getErrMsg()));
throw new Exception(String.format("parse ontology table [%s] error [%s]",
ontologyQueryTable, queryStatement.getErrMsg()));
}
List<Pair<String, String>> tables = new ArrayList<>();
tables.add(Pair.of(sqlQueryParam.getTable(), queryStatement.getSql()));
tables.add(Pair.of(ontologyQueryTable, ontologySql));
if (sqlQueryParam.isSupportWith()) {
EngineType engineType =
EngineType.fromString(queryStatement.getOntology().getDatabase().getType());
if (!SqlMergeWithUtils.hasWith(engineType, sqlQueryParam.getSql())) {
if (!SqlMergeWithUtils.hasWith(engineType, ontologyQuerySql)) {
String withSql = "with " + tables.stream()
.map(t -> String.format("%s as (%s)", t.getLeft(), t.getRight()))
.collect(Collectors.joining(",")) + "\n" + sqlQueryParam.getSql();
.collect(Collectors.joining(",")) + "\n" + ontologyQuerySql;
queryStatement.setSql(withSql);
} else {
List<String> parentTableList =
tables.stream().map(Pair::getLeft).collect(Collectors.toList());
List<String> parentSqlList =
tables.stream().map(Pair::getRight).collect(Collectors.toList());
String mergeSql = SqlMergeWithUtils.mergeWith(engineType, sqlQueryParam.getSql(),
String mergeSql = SqlMergeWithUtils.mergeWith(engineType, ontologyQuerySql,
parentSqlList, parentTableList);
queryStatement.setSql(mergeSql);
}
} else {
String dsSql = sqlQueryParam.getSql();
for (Pair<String, String> tb : tables) {
dsSql = StringUtils.replace(dsSql, tb.getLeft(), "(" + tb.getRight() + ") "
+ (sqlQueryParam.isWithAlias() ? "" : tb.getLeft()), -1);
ontologyQuerySql =
StringUtils.replace(ontologyQuerySql, tb.getLeft(), "(" + tb.getRight()
+ ") " + (sqlQueryParam.isWithAlias() ? "" : tb.getLeft()), -1);
}
queryStatement.setSql(dsSql);
queryStatement.setSql(ontologyQuerySql);
}
}

View File

@@ -28,7 +28,7 @@ public class CalciteQueryParser implements QueryParser {
.enableOptimize(queryStatement.getEnableOptimize()).build())
.build();
SqlBuilder sqlBuilder = new SqlBuilder(semanticSchema);
sqlBuilder.build(queryStatement);
sqlBuilder.buildOntologySql(queryStatement);
}
}

View File

@@ -35,7 +35,7 @@ public class SqlBuilder {
this.schema = schema;
}
public void build(QueryStatement queryStatement) throws Exception {
public void buildOntologySql(QueryStatement queryStatement) throws Exception {
this.ontologyQueryParam = queryStatement.getOntologyQueryParam();
if (ontologyQueryParam.getMetrics() == null) {
ontologyQueryParam.setMetrics(new ArrayList<>());

View File

@@ -29,7 +29,7 @@ class HeadlessParserServiceTest {
SqlBuilder aggBuilder = new SqlBuilder(semanticSchema);
QueryStatement queryStatement = new QueryStatement();
queryStatement.setOntologyQueryParam(ontologyQueryParam);
aggBuilder.build(queryStatement);
aggBuilder.buildOntologySql(queryStatement);
EngineType engineType =
EngineType.fromString(semanticSchema.getOntology().getDatabase().getType());
sqlParser.setSql(aggBuilder.getSql(engineType));

View File

@@ -6,8 +6,8 @@ spring:
password: semantic
sql:
init:
schema-locations: classpath:db/schema-h2.sql
data-locations: classpath:db/data-h2.sql
schema-locations: classpath:db/schema-h2.sql,classpath:db/schema-h2-demo.sql
data-locations: classpath:db/data-h2.sql,classpath:db/data-h2-demo.sql
h2:
console:
path: /h2-console/semantic

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,85 @@
-------S2VisitsDemo
CREATE TABLE IF NOT EXISTS `s2_user_department` (
`user_name` varchar(200) NOT NULL,
`department` varchar(200) NOT NULL, -- department of user
PRIMARY KEY (`user_name`,`department`)
);
COMMENT ON TABLE s2_user_department IS 'user_department_info';
CREATE TABLE IF NOT EXISTS `s2_pv_uv_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_pv_uv_statis IS 's2_pv_uv_statis';
CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`stay_hours` DOUBLE NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info';
-------S2ArtistDemo
CREATE TABLE IF NOT EXISTS `singer` (
`singer_name` varchar(200) NOT NULL,
`act_area` varchar(200) NOT NULL,
`song_name` varchar(200) NOT NULL,
`genre` varchar(200) NOT NULL,
`js_play_cnt` bigINT DEFAULT NULL,
`down_cnt` bigINT DEFAULT NULL,
`favor_cnt` bigINT DEFAULT NULL,
PRIMARY KEY (`singer_name`)
);
COMMENT ON TABLE singer IS 'singer_info';
CREATE TABLE IF NOT EXISTS `genre` (
`g_name` varchar(20) NOT NULL , -- genre name
`rating` INT ,
`most_popular_in` varchar(50) ,
PRIMARY KEY (`g_name`)
);
COMMENT ON TABLE genre IS 'genre';
CREATE TABLE IF NOT EXISTS `artist` (
`artist_name` varchar(50) NOT NULL , -- genre name
`citizenship` varchar(20) ,
`gender` varchar(20) ,
`g_name` varchar(50),
PRIMARY KEY (`artist_name`,`citizenship`)
);
COMMENT ON TABLE artist IS 'artist';
-------S2CompanyDemo
CREATE TABLE IF NOT EXISTS `company` (
`company_id` varchar(50) NOT NULL ,
`company_name` varchar(50) NOT NULL ,
`headquarter_address` varchar(50) NOT NULL ,
`company_established_time` varchar(20) NOT NULL ,
`founder` varchar(20) NOT NULL ,
`ceo` varchar(20) NOT NULL ,
`annual_turnover` bigint(15) ,
`employee_count` int(7) ,
PRIMARY KEY (`company_id`)
);
CREATE TABLE IF NOT EXISTS `brand` (
`brand_id` varchar(50) NOT NULL ,
`brand_name` varchar(50) NOT NULL ,
`brand_established_time` varchar(20) NOT NULL ,
`company_id` varchar(50) NOT NULL ,
`legal_representative` varchar(20) NOT NULL ,
`registered_capital` bigint(15) ,
PRIMARY KEY (`brand_id`)
);
CREATE TABLE IF NOT EXISTS `brand_revenue` (
`year_time` varchar(10) NOT NULL ,
`brand_id` varchar(50) NOT NULL ,
`revenue` bigint(15) NOT NULL,
`profit` bigint(15) NOT NULL ,
`revenue_growth_year_on_year` double NOT NULL ,
`profit_growth_year_on_year` double NOT NULL
);