You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by zh...@apache.org on 2015/09/15 10:46:59 UTC
incubator-kylin git commit: KYLIN-910,
enable edit 'auto merge time range' on UI
Repository: incubator-kylin
Updated Branches:
refs/heads/1.x-staging 1e9646fc9 -> e0f5e3983
KYLIN-910, enable edit 'auto merge time range' on UI
Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/e0f5e398
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/e0f5e398
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/e0f5e398
Branch: refs/heads/1.x-staging
Commit: e0f5e3983b127649419cbe33c27e647b8e84029f
Parents: 1e9646f
Author: jiazhong <ji...@ebay.com>
Authored: Tue Sep 15 16:46:19 2015 +0800
Committer: jiazhong <ji...@ebay.com>
Committed: Tue Sep 15 16:46:19 2015 +0800
----------------------------------------------------------------------
.../org/apache/kylin/cube/CubeInstance.java | 23 +----
.../java/org/apache/kylin/cube/CubeManager.java | 2 +-
.../org/apache/kylin/cube/model/CubeDesc.java | 20 ++--
.../kylin/rest/controller/CubeController.java | 1 -
.../rest/controller/CubeDescController.java | 1 -
.../apache/kylin/rest/request/CubeRequest.java | 8 --
.../apache/kylin/rest/service/CubeService.java | 5 +-
webapp/app/js/controllers/cubeAdvanceSetting.js | 57 +++++++++++
webapp/app/js/filters/filter.js | 10 ++
webapp/app/js/model/cubeDescModel.js | 2 +-
.../cubeDesigner/advanced_settings.html | 102 +++++++++++++++----
11 files changed, 167 insertions(+), 64 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
----------------------------------------------------------------------
diff --git a/cube/src/main/java/org/apache/kylin/cube/CubeInstance.java b/cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
index e286c2b..81a64e8 100644
--- a/cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
+++ b/cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
@@ -55,7 +55,6 @@ public class CubeInstance extends RootPersistentEntity implements IRealization {
cubeInstance.setStatus(RealizationStatusEnum.DISABLED);
cubeInstance.updateRandomUuid();
cubeInstance.setProjectName(projectName);
- cubeInstance.setRetentionRange(cubeDesc.getRetentionRange());
return cubeInstance;
}
@@ -83,12 +82,6 @@ public class CubeInstance extends RootPersistentEntity implements IRealization {
@JsonProperty("create_time_utc")
private long createTimeUTC;
- @JsonProperty("auto_merge_time_ranges")
- private long[] autoMergeTimeRanges;
-
- @JsonProperty("retention_range")
- private long retentionRange = 0;
-
private String projectName;
public List<CubeSegment> getBuildingSegments() {
@@ -355,13 +348,6 @@ public class CubeInstance extends RootPersistentEntity implements IRealization {
this.projectName = projectName;
}
- public long[] getAutoMergeTimeRanges() {
- return autoMergeTimeRanges;
- }
-
- public void setAutoMergeTimeRanges(long[] autoMergeTimeRanges) {
- this.autoMergeTimeRanges = autoMergeTimeRanges;
- }
public boolean needAutoMerge() {
if (!this.getDescriptor().getModel().getPartitionDesc().isPartitioned())
@@ -370,16 +356,9 @@ public class CubeInstance extends RootPersistentEntity implements IRealization {
if (this.getDescriptor().hasHolisticCountDistinctMeasures())
return false;
- return autoMergeTimeRanges != null && autoMergeTimeRanges.length > 0;
- }
-
- public long getRetentionRange() {
- return retentionRange;
+ return this.getDescriptor().getAutoMergeTimeRanges() != null && this.getDescriptor().getAutoMergeTimeRanges().length > 0;
}
- public void setRetentionRange(long retentionRange) {
- this.retentionRange = retentionRange;
- }
@Override
public long getDateRangeStart() {
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/cube/src/main/java/org/apache/kylin/cube/CubeManager.java
----------------------------------------------------------------------
diff --git a/cube/src/main/java/org/apache/kylin/cube/CubeManager.java b/cube/src/main/java/org/apache/kylin/cube/CubeManager.java
index e4c0e4a..b3eeeef 100644
--- a/cube/src/main/java/org/apache/kylin/cube/CubeManager.java
+++ b/cube/src/main/java/org/apache/kylin/cube/CubeManager.java
@@ -676,7 +676,7 @@ public class CubeManager implements IRealizationProvider {
return null;
}
- long[] timeRanges = cube.getAutoMergeTimeRanges();
+ long[] timeRanges = cube.getDescriptor().getAutoMergeTimeRanges();
Arrays.sort(timeRanges);
CubeSegment newSeg = null;
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
----------------------------------------------------------------------
diff --git a/cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java b/cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
index 72280ea..7f9252c 100644
--- a/cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
+++ b/cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
@@ -55,7 +55,6 @@ import org.apache.kylin.metadata.model.TblColRef;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.collect.Lists;
@@ -115,10 +114,10 @@ public class CubeDesc extends RootPersistentEntity {
private String signature;
@JsonProperty("notify_list")
private List<String> notifyList;
- /*
- * this field will not be serialized ,can be deserialized to front javascript
- */
- private long retentionRange;
+ @JsonProperty("auto_merge_time_ranges")
+ private long[] autoMergeTimeRanges;
+ @JsonProperty("retention_range")
+ private long retentionRange = 0;
private Map<String, Map<String, TblColRef>> columnMap = new HashMap<String, Map<String, TblColRef>>();
private LinkedHashSet<TblColRef> allColumns = new LinkedHashSet<TblColRef>();
@@ -768,13 +767,20 @@ public class CubeDesc extends RootPersistentEntity {
this.nullStrings = nullStrings;
}
- @JsonProperty
public long getRetentionRange() {
return retentionRange;
}
- @JsonIgnore
public void setRetentionRange(long retentionRange) {
this.retentionRange = retentionRange;
}
+
+ public long[] getAutoMergeTimeRanges() {
+ return autoMergeTimeRanges;
+ }
+
+ public void setAutoMergeTimeRanges(long[] autoMergeTimeRanges) {
+ this.autoMergeTimeRanges = autoMergeTimeRanges;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
index 734ef32..3d0fca3 100644
--- a/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
+++ b/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java
@@ -381,7 +381,6 @@ public class CubeController extends BasicController {
try {
CubeInstance cube = cubeService.getCubeManager().getCube(cubeName);
- cube.setRetentionRange(desc.getRetentionRange());
String projectName = (null == cubeRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME : cubeRequest.getProject();
desc = cubeService.updateCubeAndDesc(cube, desc, projectName);
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java b/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java
index ad22bf1..76da4ea 100644
--- a/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java
+++ b/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java
@@ -57,7 +57,6 @@ public class CubeDescController {
return null;
}
CubeDesc cSchema = cubeInstance.getDescriptor();
- cSchema.setRetentionRange(cubeInstance.getRetentionRange());
if (cSchema != null) {
return new CubeDesc[] { cSchema };
} else {
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/server/src/main/java/org/apache/kylin/rest/request/CubeRequest.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/request/CubeRequest.java b/server/src/main/java/org/apache/kylin/rest/request/CubeRequest.java
index 8af963c..e5acbe4 100644
--- a/server/src/main/java/org/apache/kylin/rest/request/CubeRequest.java
+++ b/server/src/main/java/org/apache/kylin/rest/request/CubeRequest.java
@@ -28,7 +28,6 @@ public class CubeRequest {
private String message;
private String cubeDescName;
private String project;
- private long retentionRange;
public String getUuid() {
return uuid;
@@ -131,11 +130,4 @@ public class CubeRequest {
this.project = project;
}
- public long getRetentionRange() {
- return retentionRange;
- }
-
- public void setRetentionRange(long retentionRange) {
- this.retentionRange = retentionRange;
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/service/CubeService.java b/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
index be356af..fdfd136 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/CubeService.java
@@ -574,7 +574,8 @@ public class CubeService extends BasicService {
private void keepCubeRetention(String cubeName) {
CubeInstance cube = getCubeManager().getCube(cubeName);
- if (cube.getRetentionRange() > 0) {
+ CubeDesc desc = cube.getDescriptor();
+ if (desc.getRetentionRange() > 0) {
synchronized (CubeService.class) {
cube = getCubeManager().getCube(cubeName);
List<CubeSegment> readySegs = cube.getSegment(SegmentStatusEnum.READY);
@@ -582,7 +583,7 @@ public class CubeService extends BasicService {
int position = readySegs.size() - 1;
while (position >= 0) {
currentRange += (readySegs.get(position).getDateRangeEnd() - readySegs.get(position).getDateRangeStart());
- if (currentRange >= cube.getRetentionRange()) {
+ if (currentRange >= desc.getRetentionRange()) {
break;
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/webapp/app/js/controllers/cubeAdvanceSetting.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeAdvanceSetting.js b/webapp/app/js/controllers/cubeAdvanceSetting.js
index 7e3d346..742490d 100644
--- a/webapp/app/js/controllers/cubeAdvanceSetting.js
+++ b/webapp/app/js/controllers/cubeAdvanceSetting.js
@@ -30,6 +30,30 @@ KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal, cubeConf
//edit model
if ($scope.state.mode === "edit") {
$scope.metaModel = MetaModel;
+ if(!$scope.cubeMetaFrame.auto_merge_time_ranges){
+ $scope.cubeMetaFrame.auto_merge_time_ranges = [604800000,2419200000];
+ }
+ $scope._auto_merge_time_ranges = [];
+ angular.forEach($scope.cubeMetaFrame.auto_merge_time_ranges,function(item){
+ var _day = Math.floor(item/86400000);
+ var _hour = (item%86400000)/3600000;
+
+ var rangeObj = {
+ type:'days',
+ range:0,
+ mills:0
+ }
+ if(_day==0){
+ rangeObj.type = 'hours';
+ rangeObj.range = _hour;
+ rangeObj.mills = rangeObj.range*3600000;
+ }else{
+ rangeObj.type = 'days';
+ rangeObj.range = _day;
+ rangeObj.mills = rangeObj.range*86400000;
+ }
+ $scope._auto_merge_time_ranges.push(rangeObj);
+ })
}
@@ -37,6 +61,39 @@ KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal, cubeConf
if (rowkey_column.dictionary === "true") {
rowkey_column.length = 0;
}
+ }
+
+
+ $scope.addNewMergeTimeRange = function(){
+ $scope._auto_merge_time_ranges.push({
+ type:'days',
+ range:0,
+ mills:0
+ })
+ $scope.updateAutoMergeRange();
+ }
+
+ $scope.removeTimeRange = function(arr,index,item){
+ if (index > -1) {
+ arr.splice(index, 1);
+ }
+ $scope.cubeMetaFrame.auto_merge_time_ranges.splice(index,1);
+ }
+
+
+ $scope.refreshAutoMergeTimeRanges = function(list,index,item){
+ if(item.type=='hours'){
+ item.mills = item.range*3600000;
+ }else{
+ item.mills = item.range*86400000;
+ }
+ $scope.cubeMetaFrame.auto_merge_time_ranges[index] = item.mills;
+ }
+ $scope.updateAutoMergeRange = function(){
+ $scope.cubeMetaFrame.auto_merge_time_ranges = [];
+ angular.forEach($scope._auto_merge_time_ranges,function(item){
+ $scope.cubeMetaFrame.auto_merge_time_ranges.push(item.mills);
+ })
}
});
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/webapp/app/js/filters/filter.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/filters/filter.js b/webapp/app/js/filters/filter.js
index f5d4750..2cf8114 100755
--- a/webapp/app/js/filters/filter.js
+++ b/webapp/app/js/filters/filter.js
@@ -163,4 +163,14 @@ KylinApp
return function (item) {
return item/86400000;
}
+ }).filter('timeRangeFormat', function ($filter) {
+ return function (item) {
+ var _day = Math.floor(item/86400000);
+ var _hour = (item%86400000)/3600000;
+ if(_day==0){
+ return _hour +" (Hours)"
+ }else{
+ return _day +" (Days)";
+ }
+ }
});
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/webapp/app/js/model/cubeDescModel.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/cubeDescModel.js b/webapp/app/js/model/cubeDescModel.js
index 7d20ce7..b10d1e6 100644
--- a/webapp/app/js/model/cubeDescModel.js
+++ b/webapp/app/js/model/cubeDescModel.js
@@ -49,7 +49,7 @@ KylinApp.service('CubeDescModel', function () {
"hbase_mapping": {
"column_family": []
},
- "retentionRange":"0"
+ "retention_range":"0"
};
return cubeMeta;
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/e0f5e398/webapp/app/partials/cubeDesigner/advanced_settings.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/advanced_settings.html b/webapp/app/partials/cubeDesigner/advanced_settings.html
index e5e83f2..02a83fd 100755
--- a/webapp/app/partials/cubeDesigner/advanced_settings.html
+++ b/webapp/app/partials/cubeDesigner/advanced_settings.html
@@ -21,26 +21,86 @@
<div class="form-group">
- <table style="margin-left:42px; width:92%"
- class="table table-hover list">
- <tr>
- <td>
- <!--Cube Size-->
- <div class="form-group" ng-show="userService.hasRole('ROLE_ADMIN')">
- <div class="row">
- <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Cube Size</b></label>
- <div class="col-xs-12 col-sm-6">
- <select class="form-control" ng-if="state.mode=='edit'" style="width: 360px;"
- chosen ng-model="metaModel.model.capacity" required
- ng-options="cc as cc for cc in cubeConfig.cubeCapacities">
- <option value=""></option>
- </select>
- <span ng-if="state.mode=='view'">{{metaModel.model.capacity}}</span>
- </div>
- </div>
+ <table style="margin-left:42px; width:92%" class="table table-hover list">
+ <tr>
+ <td>
+ <!--Cube Size-->
+ <div class="form-group" ng-show="userService.hasRole('ROLE_ADMIN')">
+ <div class="row">
+ <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Cube Size</b></label>
+ <div class="col-xs-12 col-sm-6">
+ <select class="form-control" ng-if="state.mode=='edit'" style="width: 360px;"
+ chosen ng-model="metaModel.model.capacity" required
+ ng-options="cc as cc for cc in cubeConfig.cubeCapacities">
+ <option value=""></option>
+ </select>
+ <span ng-if="state.mode=='view'">{{metaModel.model.capacity}}</span>
+ </div>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <!--Cube Size-->
+ <div class="form-group">
+ <div class="row">
+ <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Auto Merge Time Ranges(days)</b></label>
+ <div class="col-xs-12 col-sm-6">
+ <!--retention range is store in CubeInstance, will convert to cubeMetaFrame for front end-->
+ <div class="row" ng-if="state.mode=='edit'">
+ <table class="table">
+ <tbody>
+ <tr ng-repeat="timeRange in _auto_merge_time_ranges">
+ <td class="col-xs-4">
+ <select ng-if="timeRange.type=='hours'"
+ chosen ng-model="timeRange.range"
+ ng-options="rangeTypes as rangeTypes for rangeTypes in [0.5,1,2,4,8] "
+ ng-change="refreshAutoMergeTimeRanges(_auto_merge_time_ranges,$index,timeRange)"
+ style="width: 100% !important;"
+ data-placeholder="hours range"
+ class="chosen-select">
+ </select>
+ <input type="text" ng-if="timeRange.type=='days'" ng-change="refreshAutoMergeTimeRanges(_auto_merge_time_ranges,$index,timeRange)" class="form-control input-sm" placeholder="days range" ng-model="timeRange.range">
+ </td>
+ <td class="col-xs-4">
+ <select chosen ng-model="timeRange.type"
+ ng-options="rangeTypes as rangeTypes for rangeTypes in ['hours','days'] "
+ ng-change="refreshAutoMergeTimeRanges(_auto_merge_time_ranges,$index,timeRange)"
+ style="width: 200px !important;"
+ data-placeholder="select a project"
+ class="chosen-select">
+ </select>
+ </td>
+ <td>
+ <button class="btn btn-xs btn-info" ng-show="state.mode=='edit'" ng-click="removeTimeRange(_auto_merge_time_ranges,$index, timeRange)">
+ <i class="fa fa-minus"></i>
+ </button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <button class="btn btn-xs btn-info" ng-show="state.mode=='edit'" ng-click="addNewMergeTimeRange()">
+ New Merge Range<i class="fa fa-plus"></i>
+ </button>
</div>
- </td>
- </tr>
+ <div class="row" ng-if="state.mode=='view'">
+ <table class="table">
+ <tbody>
+ <tr ng-repeat="timeRange in cubeMetaFrame.auto_merge_time_ranges">
+ <td>
+ {{timeRange | timeRangeFormat}}
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+ </div>
+ </div>
+ </td>
+ </tr>
<tr>
<td>
<!--Cube Size-->
@@ -49,9 +109,9 @@
<label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Retention Range(days)</b></label>
<div class="col-xs-12 col-sm-6">
<!--retention range is store in CubeInstance, will convert to cubeMetaFrame for front end-->
- <input type="text" retention-format class="form-control ng-scope ng-pristine ng-valid" placeholder="how many days cube retention" ng-model="cubeMetaFrame.retentionRange" ng-if="state.mode=='edit'">
+ <input type="text" retention-format class="form-control ng-scope ng-pristine ng-valid" placeholder="how many days cube retention" ng-model="cubeMetaFrame.retention_range" ng-if="state.mode=='edit'">
<small class="help-block text-red" ng-show="state.mode=='edit'">(by default it's '0',which will keep all historic cube segments ,or will keep latest [Retention Range] days cube segments )</small>
- <span ng-if="state.mode=='view'">{{cube.retention_range | millisecondsToDay}}</span>
+ <span ng-if="state.mode=='view'">{{cubeMetaFrame.retention_range | millisecondsToDay}}</span>
</div>
</div>
</div>