| <!-- |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| --> |
| |
| <!-- Measures Summary --> |
| <div ng-controller="CubeMeasuresCtrl"> |
| <ng-form name="forms.cube_measure_form"> |
| <div class="dataTables_wrapper form-inline no-footer" ng-if="cubeMetaFrame.measures.length > 0"> |
| <table class="table table-striped table-hover"> |
| <thead> |
| <tr> |
| <th>Name</th> |
| <th>Expression</th> |
| <th>Parameters</th> |
| <th>Return Type</th> |
| <th ng-if="state.mode=='edit'">Actions</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr ng-repeat="measure in cubeMetaFrame.measures | filter: state.measureFilter track by $index"> |
| <td> |
| <!--Name --> |
| <span tooltip="measure name..">{{measure.name}}</span> |
| </td> |
| <td> |
| <!--Expression --> |
| <span>{{measure.function.expression}}</span> |
| </td> |
| <td> |
| <div class="paraTree"> |
| <ul> |
| <parametertree ng-if="measure.function.parameter!=null && measure.function.expression!=='TOP_N' && measure.function.expression!=='EXTENDED_COLUMN'" nextpara="measure.function.parameter"></parametertree> |
| <topntree ng-if="measure.function.parameter!=null && measure.function.expression=='TOP_N'" nextpara="measure.function.parameter"></topntree> |
| <extendedcolumntree ng-if="measure.function.parameter!=null && measure.function.expression=='EXTENDED_COLUMN'" nextpara="measure.function.parameter"></extendedcolumntree> |
| </ul> |
| </div> |
| <!--<span ng-if="measure.function.parameter.next_parameter!=null">{{measure.function.parameter.next_parameter |json}}</span>--> |
| </td> |
| <td> |
| <!--Return Type --> |
| <span>{{measure.function.returntype}}</span> |
| </td> |
| <td ng-if="state.mode=='edit'"> |
| <!--Edit Button --> |
| <button class="btn btn-xs btn-info" ng-click="addNewMeasure(measure, $index)"> |
| <i class="fa fa-pencil"></i> |
| </button> |
| <!--Remove Button --> |
| <button class="btn btn-xs btn-danger" ng-click="removeElement(cubeMetaFrame.measures, measure)"> |
| <i class="fa fa-trash-o"></i> |
| </button> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </ng-form> |
| |
| <!--Add Measures Button--> |
| <div class="form-group"> |
| <button class="btn btn-sm btn-info" ng-click="addNewMeasure()" ng-show="state.mode=='edit' && !newMeasure"> |
| <i class="fa fa-plus"></i> Measure |
| </button> |
| </div> |
| |
| <!--Edit Measure--> |
| <ng-form name="edit_mes_form"> |
| <div class="box box-solid" ng-if="newMeasure"> |
| <div class="box-header"> |
| <h4 class="box-title text-info">Edit Measure</h4> |
| </div> |
| <div class="box-body"> |
| <div class="row"> |
| <div class="col-xs-8"> |
| <!--Name--> |
| <div class="form-group"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Name</b></label> |
| <div class="col-xs-12 col-sm-6"> |
| <input type="text" placeholder="Name.." class="form-control" |
| tooltip="measure name.." tooltip-trigger="focus" |
| ng-model="newMeasure.name" required /> |
| </div> |
| </div> |
| </div> |
| <!--Expression--> |
| <div class="form-group middle-popover"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Expression</b> <i class="fa fa-info-circle" kylinpopover placement="right" title="Expression" template="expressionTip.html"></i></label> |
| <div class="col-xs-12 col-sm-6"> |
| <select class="form-control" |
| ng-init="newMeasure.function.expression = (!!newMeasure.function.expression)?newMeasure.function.expression:cubeConfig.dftSelections.measureExpression" chosen ng-model="newMeasure.function.expression" required |
| ng-change="measureReturnTypeUpdate();" |
| ng-options="me as me for me in cubeConfig.measureExpressions"> |
| <option value=""></option> |
| </select> |
| </div> |
| </div> |
| </div> |
| <!--Param Type--> |
| <div class="form-group" ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN' && newMeasure.function.expression !== 'TOP_N'"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Param Type</b></label> |
| <div class="col-xs-12 col-sm-6"> |
| <select class="form-control" ng-if="newMeasure.function.expression != 'COUNT'" |
| ng-init="newMeasure.function.parameter.type=(!!newMeasure.function.parameter.type)?newMeasure.function.parameter.type: 'column' " |
| chosen ng-model="newMeasure.function.parameter.type" required |
| ng-change="measureReturnTypeUpdate();" |
| ng-options="mpt as mpt for mpt in cubeConfig.measureParamType"> |
| <option value=""></option> |
| </select> |
| <span class="font-color-default" |
| ng-if="newMeasure.function.expression == 'COUNT'" |
| ng-init="newMeasure.function.parameter.type= 'constant' "><b> constant</b> |
| </span> |
| </div> |
| </div> |
| </div> |
| <!--Param Value--> |
| <div class="form-group middle-popover"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"> |
| <b ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">Host column On Fact Table</b> <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" title="Host Column" class="fa fa-info-circle" kylinpopover placement="right" template="hostTableTip.html"></i> |
| <b ng-if="newMeasure.function.expression == 'TOP_N'">ORDER|SUM by Column</b> <i ng-if="newMeasure.function.expression == 'TOP_N'" class="fa fa-info-circle" title="ORDER|SUM by Column" kylinpopover placement="right" template="topnTip.html"></i> |
| <b ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN' && newMeasure.function.expression !== 'TOP_N' ">Param Value</b> <i ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN' && newMeasure.function.expression !== 'TOP_N' " class="fa fa-info-circle" kylinpopover placement="right" title="Param Value" template="paramvalueTip.html"></i> |
| <!--tip for top_n--> |
| <!--<small ng-if="newMeasure.function.expression == 'TOP_N'" class="help-block" style="color:#3a87ad">(SUM|ORDER BY Column for TOP_N)</small>--> |
| </label> |
| |
| |
| |
| <div class="col-xs-12 col-sm-6"> |
| <span class="font-color-default" |
| ng-if="newMeasure.function.parameter.type == 'constant'" |
| ng-init="newMeasure.function.parameter.value = 1"><b> 1</b></span> |
| <!--!COUNT_DISTINCT--> |
| <select class="form-control" chosen |
| ng-if="newMeasure.function.parameter.type == 'column' && newMeasure.function.expression !== 'EXTENDED_COLUMN'" |
| ng-model="newMeasure.function.parameter.value" |
| ng-change="measureReturnTypeUpdate();" |
| ng-options="column as column for column in getCommonMetricColumns()" > |
| <option value="">-- Select a Column --</option> |
| </select> |
| <select class="form-control" chosen |
| ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" |
| ng-model="newMeasure.function.parameter.value" |
| ng-change="measureReturnTypeUpdate();" |
| ng-options="column as column for column in getExtendedHostColumn()" > |
| <option value="">-- Select a Column --</option> |
| </select> |
| </div> |
| </div> |
| </div> |
| <!--Return Type--> |
| <div class="form-group middle-popover"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"> |
| <b ng-if="newMeasure.function.expression !== 'EXTENDED_COLUMN'">Return Type</b> |
| <b ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'">Maximum length of extended column</b> <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" title="Maximum Length" class="fa fa-info-circle" kylinpopover placement="right" template="extendedTypeTip.html"></i> |
| </label> |
| <div class="col-xs-12 col-sm-6"> |
| <select class="form-control" |
| ng-if="newMeasure.function.expression == 'COUNT_DISTINCT'" |
| ng-init="newMeasure.function.returntype = (!!newMeasure.function.returntype)?newMeasure.function.returntype:cubeConfig.dftSelections.distinctDataType.value" |
| chosen ng-model="newMeasure.function.returntype" required |
| ng-options="ddt.value as ddt.name for ddt in cubeConfig.distinctDataTypes"> |
| <option value=""></option> |
| </select> |
| <select class="form-control" |
| ng-if="newMeasure.function.expression == 'TOP_N'" |
| ng-init="newMeasure.function.returntype = (!!newMeasure.function.returntype)?newMeasure.function.returntype:cubeConfig.dftSelections.topN.value" |
| chosen ng-model="newMeasure.function.returntype" required |
| ng-options="ddt.value as ddt.name for ddt in cubeConfig.topNTypes"> |
| <option value=""></option> |
| </select> |
| |
| <input extended-column-return |
| ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" |
| type="text" placeholder="Kylin won’t save more than this number of bytes" class="form-control" |
| tooltip-trigger="focus" |
| ng-init="newMeasure.function.returntype=newMeasure.function.returntype?newMeasure.function.returntype:'extendedcolumn(100)'" |
| ng-model="newMeasure.function.returntype" required /> |
| |
| <span class="font-color-default" |
| ng-if="newMeasure.function.expression != 'COUNT_DISTINCT' && newMeasure.function.expression != 'TOP_N' && newMeasure.function.expression != 'EXTENDED_COLUMN' " |
| ><b> {{newMeasure.function.returntype | uppercase}}</b> |
| </span> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="form-group middle-popover" ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"> |
| <b>Extended column on fact table</b> <i ng-if="newMeasure.function.expression == 'EXTENDED_COLUMN'" title="Extended Column" class="fa fa-info-circle" kylinpopover placement="right" template="extendedColumnTip.html"></i> |
| </label> |
| <div class="col-xs-12 col-sm-6"> |
| <select class="form-control" chosen ng-if="nextPara.type !== 'constant'" required |
| ng-model="nextPara.value" |
| ng-options="column as column for column in getCommonMetricColumns()" > |
| <option value=""></option> |
| </select> |
| </div> |
| </div> |
| </div> |
| <!--Group by Column--> |
| <div class="form-group" ng-if="newMeasure.function.expression == 'TOP_N'" > |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"> |
| <b>Group by Column</b> |
| </label> |
| <div class="form-group large-popover" > |
| <div class="box-body"> |
| <table style="margin-left:width:92%" |
| class="table table-hover table-bordered list"> |
| <thead> |
| <tr> |
| <th>ID</th> |
| <th>Column</th> |
| <th>Encoding</th> |
| <th>Length</th> |
| <th ng-if="state.mode=='edit'"></th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| |
| <tr ng-repeat="groupby_column in convertedColumns track by $index" |
| ng-class="state.mode=='edit'?'sort-item':''"> |
| |
| <td> |
| <!-- ID --> |
| <span class="ng-binding" ng-class="state.mode=='edit'?'badge':''">{{($index + 1)}}</span> |
| </td> |
| <!--Column Name --> |
| <td> |
| <select class="form-control" chosen ng-if="nextPara.type !== 'constant'" required |
| ng-model="groupby_column.name" |
| ng-options="column as column for column in getGroupBYColumns()" style="width:200px;"> |
| <option value="">--Select A Column--</option> |
| </select> |
| </td> |
| <!--Column Encoding --> |
| <td> |
| <select ng-if="state.mode=='edit'" style="width:180px;" |
| chosen ng-model="groupby_column.encoding" |
| ng-change="refreshGroupBy(convertedColumns,$index,groupby_column)" |
| ng-options="dt as dt for dt in store.supportedEncoding"> |
| <option value=""></option> |
| </select> |
| <span ng-if="state.mode=='view'">{{groupby_column.encoding}}</span> |
| |
| </td> |
| <td> |
| <!--Column Length --> |
| <input type="text" class="form-control" placeholder="Column Length.." ng-if="state.mode=='edit'" |
| tooltip="group by column length.." tooltip-trigger="focus" |
| ng-change="refreshGroupBy(convertedColumns,$index,groupby_column);" |
| ng-disabled="groupby_column.encoding=='dict'||groupby_column.encoding=='date'||groupby_column.encoding=='time'" |
| ng-model="groupby_column.valueLength" class="form-control"> |
| |
| <small class="help-block red" ng-show="state.mode=='edit' && groupby_column.encoding=='int' && (groupby_column.valueLength>8 || groupby_column.valueLength<1)">int encoding column length should between 1 and 8</small> |
| <span ng-if="state.mode=='view'">{{groupby_column.valueLength}}</span> |
| </td> |
| <td ng-if="state.mode=='edit'"> |
| <button class="btn btn-xs btn-info" |
| ng-click="removeColumn(convertedColumns, $index)"><i |
| class="fa fa-minus"></i> |
| </button> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <button class="btn btn-sm btn-info" style="margin-left:10px" |
| ng-click="addNewGroupByColumn()" ng-show="state.mode=='edit'">New Column<i class="fa fa-plus"></i> |
| </button> |
| </div> |
| |
| </div> |
| </div> |
| |
| <!--Name--> |
| <div class="form-group"> |
| <div class="row"> |
| <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b></b></label> |
| <div class="col-xs-12 col-sm-6"> |
| <table class="table table-hover table-bordered list" ng-if="nextParameters.length" ng-show="newMeasure.function.expression != 'TOP_N'"> |
| <tr> |
| <th>Type</th> |
| <th>Value</th> |
| <th></td> |
| </tr> |
| <tr ng-repeat="n_parameter in nextParameters track by $index"> |
| <td>{{n_parameter.type}}</td> |
| <td>{{n_parameter.value}}</td> |
| <td> |
| <button class="btn btn-xs btn-info" ng-click="editNextParameter(n_parameter)"> |
| <i class="fa fa-pencil"></i> |
| </button> |
| <button class="btn btn-xs btn-info" ng-click="removeParameter(nextParameters, $index)"><i class="fa fa-minus"></i> |
| </button> |
| |
| </td> |
| |
| </tr> |
| </table> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| </div> |
| </div> |
| <div class="box-footer"> |
| <button class="btn btn-sm btn-info" ng-disabled="edit_mes_form.$invalid" |
| ng-click="saveNewMeasure()" ng-show="state.mode=='edit'">OK</button> |
| <button class="btn btn-link" ng-click="clearNewMeasure()">Cancel</button> |
| </div> |
| </div> |
| </ng-form> |
| </div> |
| |
| |
| <script type="text/ng-template" id="expressionTip.html"> |
| <p>All cubes have to contain one measure for Count(1), suggest use "_Count_" as name (Has been generated automatically)</p> |
| </script> |
| <script type="text/ng-template" id="paramvalueTip.html"> |
| <ol> |
| <li>Only accept single column in param value with "Column" type</li> |
| <li>Distinct Count is approximate, please indicate Error Rate, higher accuracy degree accompanied with larger storage size and longer build time</li> |
| </ol> |
| </script> |
| |
| <script type="text/ng-template" id="extendedTypeTip.html"> |
| <p> |
| Kylin won’t save more than this number of bytes for each extended column. If exceeded it will be truncated. |
| </p> |
| </script> |
| |
| <script type="text/ng-template" id="topnTip.html"> |
| <p>Will use this column for SUM and Order by</p> |
| </script> |
| |
| <script type="text/ng-template" id="hostTableTip.html"> |
| <p>Host column is the dimension to derive from, e.g. page_id</p> |
| </script> |
| <script type="text/ng-template" id="extendedColumnTip.html"> |
| <p> |
| Extended column is derived from host, e.g. page_url. No filters on extended column! |
| </p> |
| </script> |
| |