diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java index a1fc12741..fb00aa5a0 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TypeEnums.java @@ -1,5 +1,5 @@ package com.tencent.supersonic.common.pojo.enums; public enum TypeEnums { - METRIC, DIMENSION, TAG_OBJECT, TAG, DOMAIN, DATASET, MODEL, UNKNOWN + METRIC, DIMENSION, TAG, DOMAIN, DATASET, MODEL, UNKNOWN } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/Dim.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/Dimension.java similarity index 77% rename from headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/Dim.java rename to headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/Dimension.java index 594e9915b..6ed5b0450 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/Dim.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/Dimension.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -public class Dim { +public class Dimension { private String name; @@ -27,16 +27,14 @@ public class Dim { private String description; - private int isTag; - - public Dim(String name, String bizName, DimensionType type, Integer isCreateDimension) { + public Dimension(String name, String bizName, DimensionType type, Integer isCreateDimension) { this.name = name; this.type = type; this.isCreateDimension = isCreateDimension; this.bizName = bizName; } - public Dim(String name, String bizName, DimensionType type, Integer isCreateDimension, + public Dimension(String name, String bizName, DimensionType type, Integer isCreateDimension, String expr, String dateFormat, DimensionTimeTypeParams typeParams) { this.name = name; this.type = type; @@ -47,8 +45,8 @@ public class Dim { this.bizName = bizName; } - public static Dim getDefault() { - return new Dim("数据日期", "imp_date", DimensionType.partition_time, 0, "imp_date", + public static Dimension getDefault() { + return new Dimension("数据日期", "imp_date", DimensionType.partition_time, 0, "imp_date", Constants.DAY_FORMAT, new DimensionTimeTypeParams("false", "day")); } 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 cc1424e03..8c9fc1753 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,7 +24,7 @@ public class ModelDetail { private List identifiers = Lists.newArrayList(); - private List dimensions = Lists.newArrayList(); + private List dimensions = Lists.newArrayList(); private List measures = Lists.newArrayList(); @@ -39,7 +39,7 @@ public class ModelDetail { return sqlQuery; } - public List filterTimeDims() { + public List filterTimeDims() { if (CollectionUtils.isEmpty(dimensions)) { return Lists.newArrayList(); } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimensionReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimensionReq.java index 5e62fcf68..518522696 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimensionReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimensionReq.java @@ -32,8 +32,6 @@ public class DimensionReq extends SchemaItem { private DataTypeEnums dataType; - private int isTag; - private Map ext; private DimensionTimeTypeParams typeParams; diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ModelResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ModelResp.java index d4efdcb29..afead8d78 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ModelResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ModelResp.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.headless.api.pojo.response; import com.google.common.collect.Lists; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.DrillDownDimension; import com.tencent.supersonic.headless.api.pojo.Field; import com.tencent.supersonic.headless.api.pojo.Identify; @@ -62,7 +62,7 @@ public class ModelResp extends SchemaItem { return isOpen != null && isOpen == 1; } - public List getTimeDimension() { + public List getTimeDimension() { if (modelDetail == null) { return Lists.newArrayList(); } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java index 7b3753a34..75d32ad9f 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java @@ -26,8 +26,8 @@ public class DataModelNode extends SemanticNode { sqlTable = dataModel.getSqlQuery(); } else if (dataModel.getTableQuery() != null && !dataModel.getTableQuery().isEmpty()) { if (dataModel.getType().equalsIgnoreCase(EngineType.POSTGRESQL.getName())) { - String fullTableName = Arrays.stream(dataModel.getTableQuery().split("\\.")) - .collect(Collectors.joining(".public.")); + String fullTableName = + String.join(".public.", dataModel.getTableQuery().split("\\.")); sqlTable = "select * from " + fullTableName; } else { sqlTable = "select * from " + dataModel.getTableQuery(); @@ -64,7 +64,7 @@ public class DataModelNode extends SemanticNode { for (Dimension d : datasource.getDimensions()) { List identifiers = expand(SemanticNode.parse(d.getExpr(), scope, engineType), scope); - identifiers.stream().forEach(i -> dimensions.add(i.toString())); + identifiers.forEach(i -> dimensions.add(i.toString())); dimensions.add(d.getName()); } for (Identify i : datasource.getIdentifiers()) { @@ -73,7 +73,7 @@ public class DataModelNode extends SemanticNode { for (Measure m : datasource.getMeasures()) { List identifiers = expand(SemanticNode.parse(m.getExpr(), scope, engineType), scope); - identifiers.stream().forEach(i -> { + identifiers.forEach(i -> { if (!dimensions.contains(i.toString())) { metrics.add(i.toString()); } @@ -127,7 +127,7 @@ public class DataModelNode extends SemanticNode { } public static String getNames(List dataModelList) { - return dataModelList.stream().map(d -> d.getName()).collect(Collectors.joining("_")); + return dataModelList.stream().map(DataModel::getName).collect(Collectors.joining("_")); } public static void getQueryDimensionMeasure(Ontology ontology, OntologyQueryParam queryParam, @@ -138,12 +138,12 @@ public class DataModelNode extends SemanticNode { : d) .collect(Collectors.toSet())); Set schemaMetricName = - ontology.getMetrics().stream().map(m -> m.getName()).collect(Collectors.toSet()); + ontology.getMetrics().stream().map(Metric::getName).collect(Collectors.toSet()); ontology.getMetrics().stream().filter(m -> queryParam.getMetrics().contains(m.getName())) - .forEach(m -> m.getMetricTypeParams().getMeasures().stream() + .forEach(m -> m.getMetricTypeParams().getMeasures() .forEach(mm -> queryMeasures.add(mm.getName()))); queryParam.getMetrics().stream().filter(m -> !schemaMetricName.contains(m)) - .forEach(m -> queryMeasures.add(m)); + .forEach(queryMeasures::add); } public static void mergeQueryFilterDimensionMeasure(Ontology ontology, @@ -155,13 +155,13 @@ public class DataModelNode extends SemanticNode { FilterNode.getFilterField(parse(queryParam.getWhere(), scope, engineType), filterConditions); Set queryMeasures = new HashSet<>(measures); - Set schemaMetricName = ontology.getMetrics().stream().map(m -> m.getName()) - .collect(Collectors.toSet()); + Set schemaMetricName = + ontology.getMetrics().stream().map(Metric::getName).collect(Collectors.toSet()); for (String filterCondition : filterConditions) { if (schemaMetricName.contains(filterCondition)) { ontology.getMetrics().stream() .filter(m -> m.getName().equalsIgnoreCase(filterCondition)) - .forEach(m -> m.getMetricTypeParams().getMeasures().stream() + .forEach(m -> m.getMetricTypeParams().getMeasures() .forEach(mm -> queryMeasures.add(mm.getName()))); continue; } @@ -255,7 +255,7 @@ public class DataModelNode extends SemanticNode { .collect(Collectors.toSet()); Set baseDimensions = baseDataModel.getDimensions().stream().map(Dimension::getName) .collect(Collectors.toSet()); - baseDataModel.getIdentifiers().stream().forEach(i -> baseDimensions.add(i.getName())); + baseDataModel.getIdentifiers().forEach(i -> baseDimensions.add(i.getName())); baseMeasures.retainAll(queryMeasures); if (baseMeasures.size() < queryMeasures.size()) { @@ -296,7 +296,7 @@ public class DataModelNode extends SemanticNode { visitJoinRelations, sortedJoinRelation); ontology.getJoinRelations().stream() .filter(j -> !visitJoinRelations.contains(j.getId())) - .forEach(j -> sortedJoinRelation.add(j)); + .forEach(sortedJoinRelation::add); for (JoinRelation joinRelation : sortedJoinRelation) { if (!before.contains(joinRelation.getLeft()) && !before.contains(joinRelation.getRight())) { @@ -310,8 +310,8 @@ public class DataModelNode extends SemanticNode { : joinRelation.getJoinCondition().get(0).getLeft(); if (!queryDimensions.isEmpty()) { Set linkDimension = other.getDimensions().stream() - .map(dd -> dd.getName()).collect(Collectors.toSet()); - other.getIdentifiers().stream().forEach(i -> linkDimension.add(i.getName())); + .map(Dimension::getName).collect(Collectors.toSet()); + other.getIdentifiers().forEach(i -> linkDimension.add(i.getName())); linkDimension.retainAll(queryDimensions); if (!linkDimension.isEmpty()) { isMatch = true; @@ -327,7 +327,7 @@ public class DataModelNode extends SemanticNode { } if (!isMatch && ontology.getDimensionMap().containsKey(other.getName())) { Set linkDimension = ontology.getDimensionMap().get(other.getName()) - .stream().map(dd -> dd.getName()).collect(Collectors.toSet()); + .stream().map(Dimension::getName).collect(Collectors.toSet()); linkDimension.retainAll(queryDimensions); if (!linkDimension.isEmpty()) { isMatch = true; @@ -387,15 +387,14 @@ public class DataModelNode extends SemanticNode { if (entry.getKey().equalsIgnoreCase(baseDataModel.getName())) { continue; } - Long identifierNum = entry.getValue().getIdentifiers().stream().map(i -> i.getName()) - .filter(i -> baseIdentifiers.contains(i)).count(); + long identifierNum = entry.getValue().getIdentifiers().stream().map(Identify::getName) + .filter(baseIdentifiers::contains).count(); if (identifierNum > 0) { boolean isMatch = false; if (!queryDimension.isEmpty()) { Set linkDimension = entry.getValue().getDimensions().stream() - .map(dd -> dd.getName()).collect(Collectors.toSet()); - entry.getValue().getIdentifiers().stream() - .forEach(i -> linkDimension.add(i.getName())); + .map(Dimension::getName).collect(Collectors.toSet()); + entry.getValue().getIdentifiers().forEach(i -> linkDimension.add(i.getName())); linkDimension.retainAll(queryDimension); if (!linkDimension.isEmpty()) { isMatch = true; @@ -403,7 +402,7 @@ public class DataModelNode extends SemanticNode { } if (!measures.isEmpty()) { Set linkMeasure = entry.getValue().getMeasures().stream() - .map(mm -> mm.getName()).collect(Collectors.toSet()); + .map(Measure::getName).collect(Collectors.toSet()); linkMeasure.retainAll(measures); if (!linkMeasure.isEmpty()) { isMatch = true; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SysTimeDimensionBuilder.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SysTimeDimensionBuilder.java index 2c966477c..d17b301e8 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SysTimeDimensionBuilder.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SysTimeDimensionBuilder.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.headless.core.utils; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.DimensionTimeTypeParams; import com.tencent.supersonic.headless.api.pojo.enums.DimensionType; import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptor; @@ -20,11 +20,11 @@ public class SysTimeDimensionBuilder { Pattern.compile("\\b(DATE|TIME|TIMESTAMP|YEAR|MONTH|DAY|HOUR|MINUTE|SECOND)\\b", Pattern.CASE_INSENSITIVE); - public static void addSysTimeDimension(List dims, DbAdaptor engineAdaptor) { + public static void addSysTimeDimension(List dims, DbAdaptor engineAdaptor) { log.debug("addSysTimeDimension before:{}, engineAdaptor:{}", dims, engineAdaptor); - Dim timeDim = getTimeDim(dims); + Dimension timeDim = getTimeDim(dims); if (timeDim == null) { - timeDim = Dim.getDefault(); + timeDim = Dimension.getDefault(); // todo not find the time dimension return; } @@ -34,8 +34,8 @@ public class SysTimeDimensionBuilder { log.debug("addSysTimeDimension after:{}, engineAdaptor:{}", dims, engineAdaptor); } - private static Dim generateSysDayDimension(Dim timeDim, DbAdaptor engineAdaptor) { - Dim dim = new Dim(); + private static Dimension generateSysDayDimension(Dimension timeDim, DbAdaptor engineAdaptor) { + Dimension dim = new Dimension(); dim.setBizName(TimeDimensionEnum.DAY.getName()); dim.setType(DimensionType.partition_time); dim.setExpr(generateTimeExpr(timeDim, TimeDimensionEnum.DAY.name().toLowerCase(), @@ -47,8 +47,8 @@ public class SysTimeDimensionBuilder { return dim; } - private static Dim generateSysWeekDimension(Dim timeDim, DbAdaptor engineAdaptor) { - Dim dim = new Dim(); + private static Dimension generateSysWeekDimension(Dimension timeDim, DbAdaptor engineAdaptor) { + Dimension dim = new Dimension(); dim.setBizName(TimeDimensionEnum.WEEK.getName()); dim.setType(DimensionType.partition_time); dim.setExpr(generateTimeExpr(timeDim, TimeDimensionEnum.WEEK.name().toLowerCase(), @@ -60,8 +60,8 @@ public class SysTimeDimensionBuilder { return dim; } - private static Dim generateSysMonthDimension(Dim timeDim, DbAdaptor engineAdaptor) { - Dim dim = new Dim(); + private static Dimension generateSysMonthDimension(Dimension timeDim, DbAdaptor engineAdaptor) { + Dimension dim = new Dimension(); dim.setBizName(TimeDimensionEnum.MONTH.getName()); dim.setType(DimensionType.partition_time); dim.setExpr(generateTimeExpr(timeDim, TimeDimensionEnum.MONTH.name().toLowerCase(), @@ -79,7 +79,8 @@ public class SysTimeDimensionBuilder { } // Check whether the time field contains keywords,Generation time expression - private static String generateTimeExpr(Dim timeDim, String dateType, DbAdaptor engineAdaptor) { + private static String generateTimeExpr(Dimension timeDim, String dateType, + DbAdaptor engineAdaptor) { String bizName = timeDim.getBizName(); String dateFormat = timeDim.getDateFormat(); if (containsTimeKeyword(bizName)) { @@ -90,8 +91,8 @@ public class SysTimeDimensionBuilder { } } - private static Dim getTimeDim(List timeDims) { - for (Dim dim : timeDims) { + private static Dimension getTimeDim(List timeDims) { + for (Dimension dim : timeDims) { if (dim.getType().equals(DimensionType.partition_time)) { return dim; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java index 306ac693a..22d42c9c9 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java @@ -207,7 +207,7 @@ public class S2SemanticLayerService implements SemanticLayerService { ModelResp modelResp = modelResps.get(0); String sql = String.format("select distinct %s from %s where 1=1", dimensionResp.getName(), modelResp.getName()); - List timeDims = modelResp.getTimeDimension(); + List timeDims = modelResp.getTimeDimension(); if (CollectionUtils.isNotEmpty(timeDims)) { sql = String.format("%s and %s >= '%s' and %s <= '%s'", sql, TimeDimensionEnum.DAY.getName(), queryDimValueReq.getDateInfo().getStartDate(), 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 b1b64f099..8075d421a 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 @@ -1,6 +1,6 @@ package com.tencent.supersonic.headless.server.manager; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.Identify; import com.tencent.supersonic.headless.api.pojo.Measure; import com.tencent.supersonic.headless.api.pojo.ModelDetail; @@ -53,7 +53,7 @@ public class ModelYamlManager { return dataModelYamlTpl; } - public static DimensionYamlTpl convert(Dim dim) { + public static DimensionYamlTpl convert(Dimension dim) { DimensionYamlTpl dimensionYamlTpl = new DimensionYamlTpl(); BeanUtils.copyProperties(dim, dimensionYamlTpl); dimensionYamlTpl.setName(dim.getBizName()); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/ModelDO.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/ModelDO.java index 096fccf69..eb1ad3716 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/ModelDO.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/ModelDO.java @@ -16,6 +16,7 @@ public class ModelDO { private Long domainId; + @Deprecated private Long tagObjectId; private String name; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java index 976053220..4579563b8 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java @@ -12,7 +12,7 @@ import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.headless.api.pojo.DBColumn; import com.tencent.supersonic.headless.api.pojo.DbSchema; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.Identify; import com.tencent.supersonic.headless.api.pojo.ItemDateFilter; import com.tencent.supersonic.headless.api.pojo.Measure; @@ -78,23 +78,23 @@ import java.util.stream.Collectors; @Slf4j public class ModelServiceImpl implements ModelService { - private ModelRepository modelRepository; + private final ModelRepository modelRepository; - private DatabaseService databaseService; + private final DatabaseService databaseService; - private DimensionService dimensionService; + private final DimensionService dimensionService; - private MetricService metricService; + private final MetricService metricService; - private DomainService domainService; + private final DomainService domainService; - private UserService userService; + private final UserService userService; - private DataSetService dataSetService; + private final DataSetService dataSetService; - private DateInfoRepository dateInfoRepository; + private final DateInfoRepository dateInfoRepository; - private ModelRelaService modelRelaService; + private final ModelRelaService modelRelaService; ExecutorService executor = new ThreadPoolExecutor(0, 5, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); @@ -292,7 +292,7 @@ public class ModelServiceImpl implements ModelService { if (modelReq.getModelDetail() == null) { return; } - List dims = modelReq.getModelDetail().getDimensions(); + List dims = modelReq.getModelDetail().getDimensions(); List measures = modelReq.getModelDetail().getMeasures(); List identifies = modelReq.getModelDetail().getIdentifiers(); if (CollectionUtils.isEmpty(dims)) { @@ -308,7 +308,7 @@ public class ModelServiceImpl implements ModelService { throw new InvalidArgumentException(message); } } - for (Dim dim : dims) { + for (Dimension dim : dims) { String dimForbiddenCharacters = NameCheckUtils.findForbiddenCharacters(dim.getName()); if (StringUtils.isNotBlank(dim.getName()) && StringUtils.isNotBlank(dimForbiddenCharacters)) { @@ -337,12 +337,10 @@ public class ModelServiceImpl implements ModelService { Set relations = new HashSet<>(); for (ModelRela modelRela : modelRelas) { if (modelRela.getFromModelId().equals(modelReq.getId())) { - modelRela.getJoinConditions().stream() - .forEach(r -> relations.add(r.getLeftField())); + modelRela.getJoinConditions().forEach(r -> relations.add(r.getLeftField())); } if (modelRela.getToModelId().equals(modelReq.getId())) { - modelRela.getJoinConditions().stream() - .forEach(r -> relations.add(r.getRightField())); + modelRela.getJoinConditions().forEach(r -> relations.add(r.getRightField())); } } if (relations.isEmpty()) { @@ -351,10 +349,10 @@ public class ModelServiceImpl implements ModelService { // any identify in model relation should not be deleted if (modelReq.getModelDetail() == null || CollectionUtils.isEmpty(modelReq.getModelDetail().getIdentifiers())) { - throw new InvalidArgumentException(String.format("模型关联中主键/外键不存在, 请检查")); + throw new InvalidArgumentException("模型关联中主键/外键不存在, 请检查"); } List modelIdentifiers = modelReq.getModelDetail().getIdentifiers().stream() - .map(i -> i.getBizName()).collect(Collectors.toList()); + .map(Identify::getBizName).collect(Collectors.toList()); for (String rela : relations) { if (!modelIdentifiers.contains(rela)) { throw new InvalidArgumentException(String.format("模型关联中主键/外键(%s)不存在, 请检查", rela)); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java index 2f35bcb1a..a40309f69 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.headless.server.service.impl; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.ValueDistribution; import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; @@ -93,7 +93,7 @@ public class TagQueryServiceImpl implements TagQueryService { private void correctDateConf(ItemValueReq itemValueReq, TagResp tag, User user) throws Exception { ModelResp model = modelService.getModel(tag.getModelId()); - List timeDimension = model.getTimeDimension(); + List timeDimension = model.getTimeDimension(); if (CollectionUtils.isEmpty(timeDimension)) { itemValueReq.setDateConf(null); return; @@ -112,12 +112,12 @@ public class TagQueryServiceImpl implements TagQueryService { itemValueReq.setDateConf(dateConf); } - private String queryTagDate(Dim dim) { + private String queryTagDate(Dimension dim) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dim.getDateFormat()); return LocalDate.now().plusDays(-dayBefore).format(formatter); } - private String queryTagDateFromDbBySql(Dim dim, TagResp tag, ItemValueReq itemValueReq, + private String queryTagDateFromDbBySql(Dimension dim, TagResp tag, ItemValueReq itemValueReq, User user) { String sqlPattern = "select max(%s) as %s from tbl where %s is not null"; @@ -129,7 +129,7 @@ public class TagQueryServiceImpl implements TagQueryService { if (Objects.nonNull(itemValueReq) && itemValueReq.getDateConf().getUnit() > 1) { ModelResp model = modelService.getModel(tag.getModelId()); if (Objects.nonNull(model)) { - List timeDims = model.getTimeDimension(); + List timeDims = model.getTimeDimension(); if (!CollectionUtils.isEmpty(timeDims)) { String dateFormat = timeDims.get(0).getDateFormat(); if (StringUtils.isEmpty(dateFormat)) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DictUtils.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DictUtils.java index e3d76bf97..464372467 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DictUtils.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DictUtils.java @@ -14,7 +14,7 @@ import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.JsonUtil; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.ItemValueConfig; import com.tencent.supersonic.headless.api.pojo.request.DictItemReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; @@ -401,7 +401,7 @@ public class DictUtils { private void fillStructDateBetween(QueryStructReq queryStructReq, ModelResp model, Integer itemValueDateStart, Integer itemValueDateEnd) { if (Objects.nonNull(model)) { - List timeDims = model.getTimeDimension(); + List timeDims = model.getTimeDimension(); if (!CollectionUtils.isEmpty(timeDims)) { DateConf dateConf = new DateConf(); dateConf.setDateMode(DateConf.DateMode.BETWEEN); @@ -496,7 +496,7 @@ public class DictUtils { private boolean partitionedModel(Long modelId) { ModelResp model = modelService.getModel(modelId); if (Objects.nonNull(model)) { - List timeDims = model.getTimeDimension(); + List timeDims = model.getTimeDimension(); if (!CollectionUtils.isEmpty(timeDims)) { return true; } @@ -507,7 +507,7 @@ public class DictUtils { private String generateDictDateFilterRecent(DictItemResp dictItemResp) { ModelResp model = modelService.getModel(dictItemResp.getModelId()); if (Objects.nonNull(model)) { - List timeDims = model.getTimeDimension(); + List timeDims = model.getTimeDimension(); if (!CollectionUtils.isEmpty(timeDims)) { String dateFormat = timeDims.get(0).getDateFormat(); if (StringUtils.isEmpty(dateFormat)) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/MetricConverter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/MetricConverter.java index e53753818..a04552ea3 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/MetricConverter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/MetricConverter.java @@ -7,7 +7,7 @@ import com.tencent.supersonic.common.pojo.enums.PublishEnum; import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.common.util.BeanMapper; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.MetricDefineByFieldParams; import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams; import com.tencent.supersonic.headless.api.pojo.MetricDefineByMetricParams; @@ -82,7 +82,7 @@ public class MetricConverter { metricResp.setModelName(modelResp.getName()); metricResp.setModelBizName(modelResp.getBizName()); metricResp.setDomainId(modelResp.getDomainId()); - List timeDims = modelResp.getTimeDimension(); + List timeDims = modelResp.getTimeDimension(); if (CollectionUtils.isNotEmpty(timeDims)) { metricResp.setContainsPartitionDimensions(true); } 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 88c78a2a4..dcdfe42dc 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 @@ -8,7 +8,7 @@ import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.headless.api.pojo.ColumnSchema; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.DrillDownDimension; import com.tencent.supersonic.headless.api.pojo.Identify; import com.tencent.supersonic.headless.api.pojo.Measure; @@ -111,7 +111,7 @@ public class ModelConverter { return measureResp; } - public static DimensionReq convert(Dim dim, ModelDO modelDO) { + public static DimensionReq convert(Dimension dim, ModelDO modelDO) { DimensionReq dimensionReq = new DimensionReq(); dimensionReq.setName(dim.getName()); dimensionReq.setBizName(dim.getBizName()); @@ -129,7 +129,6 @@ public class ModelConverter { dimensionReq.setType(dim.getType().name()); dimensionReq .setDescription(Objects.isNull(dim.getDescription()) ? "" : dim.getDescription()); - dimensionReq.setIsTag(dim.getIsTag()); dimensionReq.setTypeParams(dim.getTypeParams()); return dimensionReq; } @@ -188,7 +187,7 @@ public class ModelConverter { columnSchema.getAgg().getOperator(), 1); modelDetail.getMeasures().add(measure); } else { - Dim dim = new Dim(columnSchema.getName(), columnSchema.getColumnName(), + Dimension dim = new Dimension(columnSchema.getName(), columnSchema.getColumnName(), DimensionType.valueOf(columnSchema.getFiledType().name()), 1); modelDetail.getDimensions().add(dim); } @@ -216,7 +215,7 @@ public class ModelConverter { return modelDescs; } - private static boolean isCreateDimension(Dim dim) { + private static boolean isCreateDimension(Dimension dim) { return dim.getIsCreateDimension() == 1 && StringUtils.isNotBlank(dim.getName()); } @@ -228,7 +227,7 @@ public class ModelConverter { return measure.getIsCreateMetric() == 1 && StringUtils.isNotBlank(measure.getName()); } - public static List getDimToCreateDimension(ModelDetail modelDetail) { + public static List getDimToCreateDimension(ModelDetail modelDetail) { if (CollectionUtils.isEmpty(modelDetail.getDimensions())) { return Lists.newArrayList(); } @@ -256,7 +255,7 @@ public class ModelConverter { List dimensionReqs = Lists.newArrayList(); ModelDetail modelDetail = JSONObject.parseObject(modelDO.getModelDetail(), ModelDetail.class); - List dims = getDimToCreateDimension(modelDetail); + List dims = getDimToCreateDimension(modelDetail); if (!CollectionUtils.isEmpty(dims)) { dimensionReqs = dims.stream().filter(dim -> StringUtils.isNotBlank(dim.getName())) .map(dim -> convert(dim, modelDO)).collect(Collectors.toList()); diff --git a/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java b/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java index 8f815e3e4..cb8c27a73 100644 --- a/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java +++ b/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java @@ -5,7 +5,7 @@ import com.tencent.supersonic.auth.api.authentication.service.UserService; import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; import com.tencent.supersonic.common.pojo.enums.StatusEnum; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.DimensionTimeTypeParams; import com.tencent.supersonic.headless.api.pojo.Identify; import com.tencent.supersonic.headless.api.pojo.Measure; @@ -95,11 +95,11 @@ class ModelServiceImplTest { List identifiers = new ArrayList<>(); identifiers.add(new Identify("用户名", IdentifyType.primary.name(), "user_name")); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("", "imp_date", DimensionType.partition_time, 0); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("", "imp_date", DimensionType.partition_time, 0); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("", "page", DimensionType.categorical, 0); + Dimension dimension2 = new Dimension("", "page", DimensionType.categorical, 0); dimension2.setExpr("page"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions); @@ -134,11 +134,11 @@ class ModelServiceImplTest { identifiers.add(new Identify("用户名_a", IdentifyType.primary.name(), "user_name_a")); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("", "imp_date_a", DimensionType.partition_time, 0); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("", "imp_date_a", DimensionType.partition_time, 0); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("", "page_a", DimensionType.categorical, 0); + Dimension dimension2 = new Dimension("", "page_a", DimensionType.categorical, 0); dimension2.setExpr("page_a"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions); @@ -169,11 +169,11 @@ class ModelServiceImplTest { List identifiers = new ArrayList<>(); identifiers.add(new Identify("用户名", IdentifyType.primary.name(), "user_name")); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("", "imp_date", DimensionType.partition_time, 0); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("", "imp_date", DimensionType.partition_time, 0); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("", "page", DimensionType.categorical, 0); + Dimension dimension2 = new Dimension("", "page", DimensionType.categorical, 0); dimension2.setExpr("page"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions); @@ -207,11 +207,11 @@ class ModelServiceImplTest { identifiers.add(new Identify("用户名", IdentifyType.primary.name(), "user_name")); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("", "imp_date", DimensionType.partition_time, 0); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("", "imp_date", DimensionType.partition_time, 0); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("", "page", DimensionType.categorical, 0); + Dimension dimension2 = new Dimension("", "page", DimensionType.categorical, 0); dimension2.setExpr("page"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions); @@ -252,11 +252,11 @@ class ModelServiceImplTest { identifiers.add(new Identify("用户名_a", IdentifyType.primary.name(), "user_name_a")); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("", "imp_date_a", DimensionType.partition_time, 0); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("", "imp_date_a", DimensionType.partition_time, 0); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("", "page_a", DimensionType.categorical, 0); + Dimension dimension2 = new Dimension("", "page_a", DimensionType.categorical, 0); dimension2.setExpr("page_a"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions); diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2CompanyDemo.java b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2CompanyDemo.java index ef98664d4..b75dfd2a6 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2CompanyDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2CompanyDemo.java @@ -89,14 +89,14 @@ public class S2CompanyDemo extends S2BaseDemo { modelReq.setAdmins(Collections.singletonList("admin")); modelReq.setAdminOrgs(Collections.emptyList()); ModelDetail modelDetail = new ModelDetail(); - List dimensions = new ArrayList<>(); + List dimensions = new ArrayList<>(); modelDetail.setDimensions(dimensions); - dimensions.add(new Dim("公司名称", "company_name", DimensionType.categorical, 1)); - dimensions.add(new Dim("总部地点", "headquarter_address", DimensionType.categorical, 1)); - dimensions.add(new Dim("成立时间", "company_established_time", DimensionType.time, 1)); - dimensions.add(new Dim("创始人", "founder", DimensionType.categorical, 1)); - dimensions.add(new Dim("首席执行官", "ceo", DimensionType.categorical, 1)); + dimensions.add(new Dimension("公司名称", "company_name", DimensionType.categorical, 1)); + dimensions.add(new Dimension("总部地点", "headquarter_address", DimensionType.categorical, 1)); + dimensions.add(new Dimension("成立时间", "company_established_time", DimensionType.time, 1)); + dimensions.add(new Dimension("创始人", "founder", DimensionType.categorical, 1)); + dimensions.add(new Dimension("首席执行官", "ceo", DimensionType.categorical, 1)); List identifiers = new ArrayList<>(); identifiers.add(new Identify("公司id", IdentifyType.primary.name(), "company_id")); @@ -131,12 +131,13 @@ public class S2CompanyDemo extends S2BaseDemo { modelReq.setAdmins(Collections.singletonList("admin")); modelReq.setAdminOrgs(Collections.emptyList()); ModelDetail modelDetail = new ModelDetail(); - List dimensions = new ArrayList<>(); + List dimensions = new ArrayList<>(); modelDetail.setDimensions(dimensions); - dimensions.add(new Dim("品牌名称", "brand_name", DimensionType.categorical, 1)); - dimensions.add(new Dim("品牌成立时间", "brand_established_time", DimensionType.time, 1)); - dimensions.add(new Dim("法定代表人", "legal_representative", DimensionType.categorical, 1)); + dimensions.add(new Dimension("品牌名称", "brand_name", DimensionType.categorical, 1)); + dimensions.add(new Dimension("品牌成立时间", "brand_established_time", DimensionType.time, 1)); + dimensions + .add(new Dimension("法定代表人", "legal_representative", DimensionType.categorical, 1)); List identifiers = new ArrayList<>(); identifiers.add(new Identify("品牌id", IdentifyType.primary.name(), "brand_id")); @@ -168,10 +169,10 @@ public class S2CompanyDemo extends S2BaseDemo { modelReq.setAdmins(Collections.singletonList("admin")); modelReq.setAdminOrgs(Collections.emptyList()); ModelDetail modelDetail = new ModelDetail(); - List dimensions = new ArrayList<>(); + List dimensions = new ArrayList<>(); modelDetail.setDimensions(dimensions); - dimensions.add(new Dim("财年", "year_time", DimensionType.time, 1, "year_time", "yyyy", + dimensions.add(new Dimension("财年", "year_time", DimensionType.time, 1, "year_time", "yyyy", new DimensionTimeTypeParams("false", "year"))); List identifiers = new ArrayList<>(); diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2SingerDemo.java b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2SingerDemo.java index de8a71279..930e2b0d3 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2SingerDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2SingerDemo.java @@ -16,7 +16,7 @@ import com.tencent.supersonic.headless.api.pojo.AggregateTypeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.DataSetDetail; import com.tencent.supersonic.headless.api.pojo.DataSetModelConfig; import com.tencent.supersonic.headless.api.pojo.DetailTypeDefaultConfig; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.Identify; import com.tencent.supersonic.headless.api.pojo.Measure; import com.tencent.supersonic.headless.api.pojo.ModelDetail; @@ -101,10 +101,10 @@ public class S2SingerDemo extends S2BaseDemo { identifiers.add(identify); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - dimensions.add(new Dim("活跃区域", "act_area", DimensionType.categorical, 1)); - dimensions.add(new Dim("代表作", "song_name", DimensionType.categorical, 1)); - dimensions.add(new Dim("流派", "genre", DimensionType.categorical, 1)); + List dimensions = new ArrayList<>(); + dimensions.add(new Dimension("活跃区域", "act_area", DimensionType.categorical, 1)); + dimensions.add(new Dimension("代表作", "song_name", DimensionType.categorical, 1)); + dimensions.add(new Dimension("流派", "genre", DimensionType.categorical, 1)); modelDetail.setDimensions(dimensions); Measure measure1 = new Measure("播放量", "js_play_cnt", "sum", 1); diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java index c8993d559..314aa4621 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java @@ -27,7 +27,7 @@ import com.tencent.supersonic.common.util.ChatAppManager; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.headless.api.pojo.DataSetDetail; import com.tencent.supersonic.headless.api.pojo.DataSetModelConfig; -import com.tencent.supersonic.headless.api.pojo.Dim; +import com.tencent.supersonic.headless.api.pojo.Dimension; import com.tencent.supersonic.headless.api.pojo.DimensionTimeTypeParams; import com.tencent.supersonic.headless.api.pojo.Field; import com.tencent.supersonic.headless.api.pojo.FieldParam; @@ -199,9 +199,9 @@ public class S2VisitsDemo extends S2BaseDemo { identifiers.add(new Identify("用户", IdentifyType.primary.name(), "user_name", 1)); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - dimensions.add(new Dim("部门", "department", DimensionType.categorical, 1)); - // dimensions.add(new Dim("用户", "user_name", DimensionType.categorical, 1)); + List dimensions = new ArrayList<>(); + dimensions.add(new Dimension("部门", "department", DimensionType.categorical, 1)); + // dimensions.add(new Dimension("用户", "user_name", DimensionType.categorical, 1)); modelDetail.setDimensions(dimensions); List fields = Lists.newArrayList(); fields.add(Field.builder().fieldName("user_name").dataType("Varchar").build()); @@ -230,11 +230,11 @@ public class S2VisitsDemo extends S2BaseDemo { identifiers.add(new Identify("用户名", IdentifyType.foreign.name(), "user_name", 0)); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("", "imp_date", DimensionType.partition_time, 0); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("", "imp_date", DimensionType.partition_time, 0); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("", "page", DimensionType.categorical, 0); + Dimension dimension2 = new Dimension("", "page", DimensionType.categorical, 0); dimension2.setExpr("page"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions); @@ -274,11 +274,11 @@ public class S2VisitsDemo extends S2BaseDemo { identifiers.add(new Identify("用户", IdentifyType.foreign.name(), "user_name", 0)); modelDetail.setIdentifiers(identifiers); - List dimensions = new ArrayList<>(); - Dim dimension1 = new Dim("数据日期", "imp_date", DimensionType.partition_time, 1); + List dimensions = new ArrayList<>(); + Dimension dimension1 = new Dimension("数据日期", "imp_date", DimensionType.partition_time, 1); dimension1.setTypeParams(new DimensionTimeTypeParams()); dimensions.add(dimension1); - Dim dimension2 = new Dim("页面", "page", DimensionType.categorical, 1); + Dimension dimension2 = new Dimension("页面", "page", DimensionType.categorical, 1); dimension2.setExpr("page"); dimensions.add(dimension2); modelDetail.setDimensions(dimensions);