mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:51:00 +00:00
[improvement][headless]Add company demo schema and data to integration test.
[improvement][headless]Clean code logic of headless translator.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<>());
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
1083
launchers/standalone/src/test/resources/db/data-h2-demo.sql
Normal file
1083
launchers/standalone/src/test/resources/db/data-h2-demo.sql
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user