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>