diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/ModelDetail.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/ModelDetail.java index dd1d62c0d..7c6350e55 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/ModelDetail.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/ModelDetail.java @@ -24,6 +24,8 @@ public class ModelDetail { private String tableQuery; + private String filterSql; + private List identifiers = Lists.newArrayList(); private List dimensions = Lists.newArrayList(); diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ModelBuildReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ModelBuildReq.java index d0d0b48cb..d56cd66b2 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ModelBuildReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/ModelBuildReq.java @@ -19,6 +19,8 @@ public class ModelBuildReq { private String sql; + private String filterSql; + private String catalog; private String db; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java index 720a9b1dc..e1d57f87d 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java @@ -40,11 +40,23 @@ public class DataModelNode extends SemanticNode { .equalsIgnoreCase(EngineType.POSTGRESQL.getName())) { String fullTableName = String.join(".public.", dataModel.getModelDetail().getTableQuery().split("\\.")); - sqlTable = "select * from " + fullTableName; + sqlTable = "SELECT * FROM " + fullTableName; } else { - sqlTable = "select * from " + dataModel.getModelDetail().getTableQuery(); + sqlTable = "SELECT * FROM " + dataModel.getModelDetail().getTableQuery(); } } + + // String filterSql = dataModel.getFilterSql(); + String filterSql = dataModel.getModelDetail().getFilterSql(); + if (filterSql != null && !filterSql.isEmpty()) { + boolean sqlContainWhere = sqlTable.toUpperCase().matches("(?s).*\\bWHERE\\b.*"); + if (sqlContainWhere) { + sqlTable = String.format("%s AND %s", sqlTable, filterSql); + } else { + sqlTable = String.format("%s WHERE %s", sqlTable, filterSql); + } + } + if (sqlTable.isEmpty()) { throw new Exception("DataModelNode build error [tableSqlNode not found]"); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java index 9a07684ca..bb0f3a6f7 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java @@ -36,6 +36,7 @@ public class ModelYamlManager { } else { dataModelYamlTpl.setTableQuery(modelDetail.getTableQuery()); } + dataModelYamlTpl.setFilterSql(modelDetail.getFilterSql()); dataModelYamlTpl.setFields(modelResp.getModelDetail().getFields()); dataModelYamlTpl.setId(modelResp.getId()); return dataModelYamlTpl; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java index 570eb87b7..8c12c376a 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java @@ -97,6 +97,7 @@ public class SemanticSchemaManager { modelDetail.setDbType(d.getType()); modelDetail.setSqlQuery(d.getSqlQuery()); modelDetail.setTableQuery(d.getTableQuery()); + modelDetail.setFilterSql(d.getFilterSql()); modelDetail.getIdentifiers().addAll(getIdentify(d.getIdentifiers())); modelDetail.getMeasures().addAll(getMeasureParams(d.getMeasures())); modelDetail.getDimensions().addAll(getDimensions(d.getDimensions())); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java index 67813590c..75208392a 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java @@ -21,6 +21,8 @@ public class DataModelYamlTpl { private String tableQuery; + private String filterSql; + private List identifiers; private List dimensions; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java index 980ddbdf4..4bbcd7c2d 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java @@ -179,6 +179,7 @@ public class ModelConverter { } } modelDetail.setFields(fields); + modelDetail.setFilterSql(modelBuildReq.getFilterSql()); modelReq.setModelDetail(modelDetail); return modelReq; }