mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-13 13:07:32 +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();
|
SqlQueryParam sqlQueryParam = queryStatement.getSqlQueryParam();
|
||||||
log.info("parse with ontology: [{}]", ontologyQueryParam);
|
log.info("parse with ontology: [{}]", ontologyQueryParam);
|
||||||
ComponentFactory.getQueryParser().parse(queryStatement);
|
ComponentFactory.getQueryParser().parse(queryStatement);
|
||||||
|
String ontologyQueryTable = sqlQueryParam.getTable();
|
||||||
|
String ontologyQuerySql = sqlQueryParam.getSql();
|
||||||
|
String ontologySql = queryStatement.getSql();
|
||||||
|
|
||||||
if (!queryStatement.isOk()) {
|
if (!queryStatement.isOk()) {
|
||||||
throw new Exception(String.format("parse table [%s] error [%s]",
|
throw new Exception(String.format("parse ontology table [%s] error [%s]",
|
||||||
sqlQueryParam.getTable(), queryStatement.getErrMsg()));
|
ontologyQueryTable, queryStatement.getErrMsg()));
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Pair<String, String>> tables = new ArrayList<>();
|
List<Pair<String, String>> tables = new ArrayList<>();
|
||||||
tables.add(Pair.of(sqlQueryParam.getTable(), queryStatement.getSql()));
|
|
||||||
|
tables.add(Pair.of(ontologyQueryTable, ontologySql));
|
||||||
if (sqlQueryParam.isSupportWith()) {
|
if (sqlQueryParam.isSupportWith()) {
|
||||||
EngineType engineType =
|
EngineType engineType =
|
||||||
EngineType.fromString(queryStatement.getOntology().getDatabase().getType());
|
EngineType.fromString(queryStatement.getOntology().getDatabase().getType());
|
||||||
if (!SqlMergeWithUtils.hasWith(engineType, sqlQueryParam.getSql())) {
|
if (!SqlMergeWithUtils.hasWith(engineType, ontologyQuerySql)) {
|
||||||
String withSql = "with " + tables.stream()
|
String withSql = "with " + tables.stream()
|
||||||
.map(t -> String.format("%s as (%s)", t.getLeft(), t.getRight()))
|
.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);
|
queryStatement.setSql(withSql);
|
||||||
} else {
|
} else {
|
||||||
List<String> parentTableList =
|
List<String> parentTableList =
|
||||||
tables.stream().map(Pair::getLeft).collect(Collectors.toList());
|
tables.stream().map(Pair::getLeft).collect(Collectors.toList());
|
||||||
List<String> parentSqlList =
|
List<String> parentSqlList =
|
||||||
tables.stream().map(Pair::getRight).collect(Collectors.toList());
|
tables.stream().map(Pair::getRight).collect(Collectors.toList());
|
||||||
String mergeSql = SqlMergeWithUtils.mergeWith(engineType, sqlQueryParam.getSql(),
|
String mergeSql = SqlMergeWithUtils.mergeWith(engineType, ontologyQuerySql,
|
||||||
parentSqlList, parentTableList);
|
parentSqlList, parentTableList);
|
||||||
queryStatement.setSql(mergeSql);
|
queryStatement.setSql(mergeSql);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String dsSql = sqlQueryParam.getSql();
|
|
||||||
for (Pair<String, String> tb : tables) {
|
for (Pair<String, String> tb : tables) {
|
||||||
dsSql = StringUtils.replace(dsSql, tb.getLeft(), "(" + tb.getRight() + ") "
|
ontologyQuerySql =
|
||||||
+ (sqlQueryParam.isWithAlias() ? "" : tb.getLeft()), -1);
|
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())
|
.enableOptimize(queryStatement.getEnableOptimize()).build())
|
||||||
.build();
|
.build();
|
||||||
SqlBuilder sqlBuilder = new SqlBuilder(semanticSchema);
|
SqlBuilder sqlBuilder = new SqlBuilder(semanticSchema);
|
||||||
sqlBuilder.build(queryStatement);
|
sqlBuilder.buildOntologySql(queryStatement);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class SqlBuilder {
|
|||||||
this.schema = schema;
|
this.schema = schema;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void build(QueryStatement queryStatement) throws Exception {
|
public void buildOntologySql(QueryStatement queryStatement) throws Exception {
|
||||||
this.ontologyQueryParam = queryStatement.getOntologyQueryParam();
|
this.ontologyQueryParam = queryStatement.getOntologyQueryParam();
|
||||||
if (ontologyQueryParam.getMetrics() == null) {
|
if (ontologyQueryParam.getMetrics() == null) {
|
||||||
ontologyQueryParam.setMetrics(new ArrayList<>());
|
ontologyQueryParam.setMetrics(new ArrayList<>());
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class HeadlessParserServiceTest {
|
|||||||
SqlBuilder aggBuilder = new SqlBuilder(semanticSchema);
|
SqlBuilder aggBuilder = new SqlBuilder(semanticSchema);
|
||||||
QueryStatement queryStatement = new QueryStatement();
|
QueryStatement queryStatement = new QueryStatement();
|
||||||
queryStatement.setOntologyQueryParam(ontologyQueryParam);
|
queryStatement.setOntologyQueryParam(ontologyQueryParam);
|
||||||
aggBuilder.build(queryStatement);
|
aggBuilder.buildOntologySql(queryStatement);
|
||||||
EngineType engineType =
|
EngineType engineType =
|
||||||
EngineType.fromString(semanticSchema.getOntology().getDatabase().getType());
|
EngineType.fromString(semanticSchema.getOntology().getDatabase().getType());
|
||||||
sqlParser.setSql(aggBuilder.getSql(engineType));
|
sqlParser.setSql(aggBuilder.getSql(engineType));
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ spring:
|
|||||||
password: semantic
|
password: semantic
|
||||||
sql:
|
sql:
|
||||||
init:
|
init:
|
||||||
schema-locations: classpath:db/schema-h2.sql
|
schema-locations: classpath:db/schema-h2.sql,classpath:db/schema-h2-demo.sql
|
||||||
data-locations: classpath:db/data-h2.sql
|
data-locations: classpath:db/data-h2.sql,classpath:db/data-h2-demo.sql
|
||||||
h2:
|
h2:
|
||||||
console:
|
console:
|
||||||
path: /h2-console/semantic
|
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