From 4e46001a693649328c24e9bc5ecf237d9f4913c4 Mon Sep 17 00:00:00 2001 From: Cheng Wang Date: Fri, 17 Feb 2017 10:05:28 +0800 Subject: [PATCH] KYLIN-2452 validate there is at least one AggregationGroup --- .../java/org/apache/kylin/cube/model/CubeDesc.java | 18 ++++++++++-------- .../apache/kylin/rest/controller/CubeController.java | 13 +++++++++---- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java b/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java index 9acb90c..5f5b437 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java @@ -440,6 +440,8 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { } public int getBuildLevel() { + if (aggregationGroups.size() <= 0) + throw new IllegalStateException("AggregationGroup size is: " + aggregationGroups.size() + ", there should be at least one AggregationGroup!"); return Collections.max(Collections2.transform(aggregationGroups, new Function() { @Nullable @Override @@ -554,7 +556,7 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { initMeasureColumns(); rowkey.init(this); - + validateAggregationGroups(); // check if aggregation group is valid for (AggregationGroup agg : this.aggregationGroups) { agg.init(this, rowkey); @@ -752,13 +754,13 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { } initDerivedMap(dimColArray, DeriveType.LOOKUP, join, derivedCols, derivedExtra); } - + if (join != null) { allColumns.addAll(Arrays.asList(join.getForeignKeyColumns())); allColumns.addAll(Arrays.asList(join.getPrimaryKeyColumns())); } } - + // PK-FK derive the other side Set realDimensions = new HashSet<>(listDimensionColumnsExcludingDerived(true)); for (JoinTableDesc joinTable : model.getJoinTables()) { @@ -777,7 +779,7 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { } } } - + private String[][] splitDerivedColumnAndExtra(String[] derived) { String[] cols = new String[derived.length]; String[] extra = new String[derived.length]; @@ -810,7 +812,7 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { i--; } } - + if (derivedCols.length == 0) return; @@ -826,7 +828,7 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { infoList = new ArrayList(); hostToDerivedMap.put(hostColArray, infoList); } - + // Merged duplicated derived column List whatsLeft = new ArrayList<>(); for (TblColRef derCol : derivedCols) { @@ -966,7 +968,7 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { allColumns.addAll(Arrays.asList(join.getPrimaryKeyColumns())); } } - + for (TblColRef col : allColumns) { allColumnDescs.add(col.getColumnDesc()); } @@ -1142,7 +1144,7 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware { return null; } - + /** Get a column which can be used to cluster the source table. * To reduce memory footprint in base cuboid for global dict */ // TODO handle more than one ultra high cardinality columns use global dict in one cube diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java index f905fe1..fb4be5a 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java @@ -327,10 +327,10 @@ public class CubeController extends BasicController { throw new InternalErrorException("Cannot find cube '" + cubeName + "'"); } -// if (cube.getSegments() != null && cube.getBuildingSegments().size() > 0) { -// int num = cube.getBuildingSegments().size(); -// throw new InternalErrorException("Cannot purge cube '" + cubeName + "' as there is " + num + " building " + (num > 1 ? "segment(s)." : "segment. Discard the related job first.")); -// } + // if (cube.getSegments() != null && cube.getBuildingSegments().size() > 0) { + // int num = cube.getBuildingSegments().size(); + // throw new InternalErrorException("Cannot purge cube '" + cubeName + "' as there is " + num + " building " + (num > 1 ? "segment(s)." : "segment. Discard the related job first.")); + // } return cubeService.purgeCube(cube); } catch (Exception e) { @@ -426,6 +426,7 @@ public class CubeController extends BasicController { public CubeRequest saveCubeDesc(@RequestBody CubeRequest cubeRequest) { CubeDesc desc = deserializeCubeDesc(cubeRequest); + if (desc == null) { cubeRequest.setMessage("CubeDesc is null."); return cubeRequest; @@ -440,6 +441,10 @@ public class CubeController extends BasicController { throw new BadRequestException("Invalid Cube name, only letters, numbers and underline supported."); } + int aggSize = desc.getAggregationGroups().size(); + if (aggSize <= 0) + throw new IllegalStateException("AggregationGroup size is: " + aggSize + ", there should be at least one AggregationGroup!"); + try { desc.setUuid(UUID.randomUUID().toString()); String projectName = (null == cubeRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME : cubeRequest.getProject(); -- 2.7.4 (Apple Git-66)