This is an automated email from the ASF dual-hosted git repository.

lauraxia pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/kylin5 by this push:
     new 2067e8d641 KYLIN-5682 er graph column pagination issue
2067e8d641 is described below

commit 2067e8d6413002234fd171edfccaea7cbc92cd3b
Author: Qian Xia <lauraxiaq...@gmail.com>
AuthorDate: Wed Aug 9 17:46:01 2023 +0800

    KYLIN-5682 er graph column pagination issue
---
 kystudio/src/canvas/ModelTable/ModelTable.vue      |  2 +-
 .../common/ModelERDiagram/ModelERDiagram.vue       | 36 +++++++++++++++++-----
 .../components/common/ModelERDiagram/handler.js    |  2 +-
 .../studio/StudioModel/ModelEdit/index.vue         | 10 +++---
 .../studio/StudioModel/ModelEdit/table.js          |  1 +
 .../ModelList/ModelOverview/ModelOverview.vue      | 12 ++++----
 kystudio/src/util/dataGenerator.js                 | 32 ++++++++++---------
 7 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/kystudio/src/canvas/ModelTable/ModelTable.vue 
b/kystudio/src/canvas/ModelTable/ModelTable.vue
index 6b929a9765..585c4721a6 100644
--- a/kystudio/src/canvas/ModelTable/ModelTable.vue
+++ b/kystudio/src/canvas/ModelTable/ModelTable.vue
@@ -3,7 +3,7 @@
     <TableHeader
       :width="width"
       :table-alias="table.alias"
-      :is-fact-table="table.type === 'FACT'"
+      :is-fact-table="table.kind === 'FACT'"
     />
   </v-group>
 </template>
diff --git a/kystudio/src/components/common/ModelERDiagram/ModelERDiagram.vue 
b/kystudio/src/components/common/ModelERDiagram/ModelERDiagram.vue
index f978fa52d9..aee24c5ca9 100644
--- a/kystudio/src/components/common/ModelERDiagram/ModelERDiagram.vue
+++ b/kystudio/src/components/common/ModelERDiagram/ModelERDiagram.vue
@@ -2,11 +2,11 @@
   <div :class="['model-er-diagram', {'is-full-screen': isFullScreen}]" 
v-drag="{sizeChangeCb:dragBox}" v-loading="loadingER">
     <el-alert class="alertChangeER" :title="$t('changeERTips')" type="warning" 
show-icon :closable="false" v-if="changeER && showChangeAlert"></el-alert>
     <div class="er-layout" ref="el-draw-layout" v-if="currentModel" 
:style="getErLayoutStyle">
-      <div :class="['table-box', {'is-lookup': t.type !== 'FACT'}]" 
:id="t.guid" v-for="t in currentModel.tables" :key="t.guid" 
:style="getTableStyles(t)">
+      <div :class="['table-box', {'is-lookup': t.kind !== 'FACT'}]" 
:id="t.guid" v-for="t in modelData.tables" :key="t.guid" 
:style="getTableStyles(t)">
         <div :class="['table-title', {'table-spread-out': !t.spreadOut}]" 
@dblclick="handleDBClick(t)">
           <span class="table-sign">
-            <el-tooltip :content="$t(t.type)" placement="top">
-              <i class="el-ksd-n-icon-symbol-f-filled kind" v-if="t.type === 
'FACT'"></i>
+            <el-tooltip :content="$t(t.kind)" placement="top">
+              <i class="el-ksd-n-icon-symbol-f-filled kind" v-if="t.kind === 
'FACT'"></i>
               <i v-else class="el-ksd-n-icon-dimention-table-filled kind"></i>
             </el-tooltip>
           </span>
@@ -25,6 +25,7 @@
               :key="col.id"
               :id="`${t.guid}_${col.name}`"
               :class="{'is-pfk': isPFK(col.name, t).isPK || isPFK(col.name, 
t).isFK}"
+              v-scroll.observe.reactive @scroll-bottom="handleScrollBottom(t)"
               @mouseleave="(e) => handleMouseLeave(e, t, col)"
               @mouseenter="(e) => handleMouseEnterColumn(e, t, col)"
             >
@@ -35,6 +36,7 @@
                 <span :class="['col-name', {'is-link': col.isPFK}]" 
v-custom-tooltip="{text: col.name, w: 30, effect: 'dark', 'popper-class': 
'popper--small', 'visible-arrow': false, position: 'bottom-start', observerId: 
t.guid}">{{col.name}}</span>
               </span>
             </li>
+            <li class="li-load-more" v-if="t.hasMoreColumns && t.hasScrollEnd 
&& !showOnlyConnectedColumn"><i class="el-ksd-icon-loading_16"></i></li>
           </ul>
         </div>
       </div>
@@ -135,7 +137,17 @@ export default class ModelERDiagram extends Vue {
     return table.spreadOut ? table.columns.length > num ? `${num}` 
:`${table.columns.length}` : ''
   }
   getColumns (t) {
-    return this.showOnlyConnectedColumn ? t.columns.filter(it => 
this.isPFK(it.name, t).isPK || this.isPFK(it.name, t).isFK) : t.columns
+    return this.showOnlyConnectedColumn ? t.showColumns.filter(it => 
this.isPFK(it.name, t).isPK || this.isPFK(it.name, t).isFK) : t.showColumns
+  }
+  // 滚动加载 columns
+  handleScrollBottom (table) {
+    if (table.hasMoreColumns) {
+      table.hasScrollEnd = true
+      setTimeout(() => {
+        table.loadMoreColumns()
+        table.hasScrollEnd = false
+      }, 300)
+    }
   }
   async created () {
     this.loadingER = true
@@ -333,9 +345,12 @@ export default class ModelERDiagram extends Vue {
   exchangeTableData () {
     const currentTableTitle = this.$el.querySelector('.table-title')
     const modelTableBoxBorder = 
+window.getComputedStyle(currentTableTitle)['borderWidth'].replace(/px/, '')
-    for (let item in this.currentModel.tables) {
-      const t = this.currentModel.tables[item]
+    for (let item in this.modelData.tables) {
+      const t = this.modelData.tables[item]
       const canvasHeight = 
this.currentModel.canvas.coordinate[`${t.alias}`].height
+      if (canvasHeight > modelRenderConfig.tableBoxHeight * 2) {
+        this.handleScrollBottom(t)
+      }
       if (canvasHeight === currentTableTitle.offsetHeight + 
modelTableBoxBorder * 2 + 4) {
         this.$set(t, 'spreadOut', false)
         this.$set(t, 'spreadHeight', modelRenderConfig.tableBoxHeight)
@@ -371,7 +386,7 @@ export default class ModelERDiagram extends Vue {
   exchangePosition () {
     if (this.source === 'modelList') {
       if (!(this.currentModel && this.currentModel.tables)) return
-      const [factTable] = this.currentModel.tables.filter(it => it.type === 
'FACT')
+      const [factTable] = this.currentModel.tables.filter(it => it.kind === 
'FACT')
       const factGuid = factTable.guid
       document.getElementById(factGuid).scrollIntoView()
     }
@@ -573,6 +588,13 @@ export default class ModelERDiagram extends Vue {
               background-color: @warning-color-3;
             }
           }
+          &.li-load-more {
+            text-align:center;
+            cursor:pointer;
+            font-size: 12px;
+            color: @text-disabled-color;
+            border-bottom:none;
+          }
         }
       }
     }
diff --git a/kystudio/src/components/common/ModelERDiagram/handler.js 
b/kystudio/src/components/common/ModelERDiagram/handler.js
index 85c14c28df..706960d51b 100644
--- a/kystudio/src/components/common/ModelERDiagram/handler.js
+++ b/kystudio/src/components/common/ModelERDiagram/handler.js
@@ -99,7 +99,7 @@ function autoCalcLayer (tables, model) {
     height: 230,
     width: 200
   }
-  const [factTable] = tables.filter(it => it.type === 'FACT')
+  const [factTable] = tables.filter(it => it.kind === 'FACT')
   if (!factTable) {
     return
   }
diff --git a/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue 
b/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue
index ee17a8a4df..2ed4f485c1 100644
--- a/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue
+++ b/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue
@@ -464,7 +464,7 @@ import { mapActions, mapGetters, mapMutations, mapState } 
from 'vuex'
 import locales from './locales'
 import DataSourceBar from '../../../common/DataSourceBar'
 import { handleSuccess, handleError, loadingBox, kylinMessage, kylinConfirm } 
from '../../../../util/business'
-import { isIE, groupData, objectClone, filterObjectArray, handleSuccessAsync, 
indexOfObjWithSomeKey, debounceEvent } from '../../../../util'
+import { isIE, groupData, objectClone, filterObjectArray, handleSuccessAsync, 
indexOfObjWithSomeKey } from '../../../../util'
 import $ from 'jquery'
 import DimensionModal from '../DimensionsModal/index.vue'
 import BatchMeasureModal from '../BatchMeasureModal/index.vue'
@@ -2223,6 +2223,9 @@ export default class ModelEdit extends Vue {
     const modelTableBoxBorder = 
+window.getComputedStyle(modelTableTitle)['borderWidth'].replace(/px/, '')
     for (let item in this.modelRender.tables) {
       const { drawSize } = this.modelRender.tables[item]
+      if (drawSize.height > modelRenderConfig.tableBoxHeight * 2) {
+        this.handleScrollBottom(this.modelRender.tables[item])
+      }
       if (drawSize.height === modelTableTitle.offsetHeight + 
modelTableBoxBorder * 2 + 4) {
         this.modelRender.tables[item].spreadOut = false
         this.modelRender.tables[item].spreadHeight = 
modelRenderConfig.tableBoxHeight
@@ -2245,11 +2248,6 @@ export default class ModelEdit extends Vue {
   async checkInvalidIndex () {
     if (this.extraoption.action === 'edit') {
       const res = await this.modelInstance.generateMetadata(true)
-      // const _data = {
-      //   project: this.currentSelectedProject,
-      //   model_id: res.uuid,
-      //   join_tables: res.join_tables
-      // }
       const response = await this.invalidIndexes(res)
       const result = await handleSuccessAsync(response)
       const { computed_columns, anti_flatten_lookups } = result
diff --git a/kystudio/src/components/studio/StudioModel/ModelEdit/table.js 
b/kystudio/src/components/studio/StudioModel/ModelEdit/table.js
index 40f92cecf8..045e729172 100644
--- a/kystudio/src/components/studio/StudioModel/ModelEdit/table.js
+++ b/kystudio/src/components/studio/StudioModel/ModelEdit/table.js
@@ -19,6 +19,7 @@ class NTable {
     this.getOtherTableByGuid = options.getTableByGuid
     this.kind = options.kind ? options.kind : options.fact ? 
modelRenderConfig.tableKind.fact : modelRenderConfig.tableKind.lookup // table 
类型
     this.joinInfo = {} // 链接对象
+    this.join = options.join // ER 图传进来的join
     this.guid = options.guid || sampleGuid() // identify id
     this.alias = options.alias || options.table // 别名
     this.source_type = options.source_type
diff --git 
a/kystudio/src/components/studio/StudioModel/ModelList/ModelOverview/ModelOverview.vue
 
b/kystudio/src/components/studio/StudioModel/ModelList/ModelOverview/ModelOverview.vue
index 446ed951e7..17a9eff9c6 100644
--- 
a/kystudio/src/components/studio/StudioModel/ModelList/ModelOverview/ModelOverview.vue
+++ 
b/kystudio/src/components/studio/StudioModel/ModelList/ModelOverview/ModelOverview.vue
@@ -1,13 +1,13 @@
 <template>
   <el-tabs :class="['model-overview', {'er-overview': activeTab === 
'erDiagram'}]" v-model="activeTab" v-if="model">
-    <el-tab-pane :label="$t('erDiagram')" name="erDiagram">
-      <ModelERDiagram ref="$er-diagram" :model="model" />
-    </el-tab-pane>
     <el-tab-pane :label="$t('dimension')" name="dimension">
-      <ModelDimensionList :model="model" />
+      <ModelDimensionList :model="model"  v-if="activeTab === 'dimension'"  />
     </el-tab-pane>
     <el-tab-pane :label="$t('measure')" name="measure">
-      <ModelMeasureList :model="model" />
+      <ModelMeasureList :model="model" v-if="activeTab === 'measure'" />
+    </el-tab-pane>
+    <el-tab-pane :label="$t('erDiagram')" name="erDiagram">
+      <ModelERDiagram ref="$er-diagram" :model="model" v-if="activeTab === 
'erDiagram'" />
     </el-tab-pane>
   </el-tabs>
 </template>
@@ -32,7 +32,7 @@ import ModelMeasureList from 
'../../../../common/ModelMeasureList/ModelMeasureLi
   locales
 })
 export default class ModelOverview extends Vue {
-  activeTab = 'erDiagram'
+  activeTab = 'dimension'
   modelData = null
 
   // 此处有待调查:为何删除模型的瞬间,会造成模型object变化?
diff --git a/kystudio/src/util/dataGenerator.js 
b/kystudio/src/util/dataGenerator.js
index d25206b7b9..5761794f80 100644
--- a/kystudio/src/util/dataGenerator.js
+++ b/kystudio/src/util/dataGenerator.js
@@ -1,3 +1,4 @@
+import NTable from '../components/studio/StudioModel/ModelEdit/table'
 import { sampleGuid } from './index'
 /**
  * 找出lookup表的主键表和外键表
@@ -48,15 +49,24 @@ function getTablesData (modelData) {
     // 所有表集合 = 事实表 + 维度表
     const allTablesInfo = [factInfo, ...lookupsInfo]
     // 将simplified_tables和table_info组合,成为table data列表
-    tablesData = allTablesInfo.map(tableInfo => ({
-      guid: sampleGuid(),
-      ...tableInfo,
-      ...tableColumnDataMap[tableInfo.table]
-    }))
+    tablesData = allTablesInfo.map(tableInfo => {
+      const option = {
+        guid: sampleGuid(),
+        ...tableInfo,
+        ...tableColumnDataMap[tableInfo.table]
+      }
+      option.computed_columns = option.columns.filter((col) => {
+        return col.is_computed_column
+      }).map(c => ({
+        ...c,
+        tableAlias: factAlias,
+        columnName: c.name
+      }))
+      return new NTable(option)
+    })
   } catch (e) {
     console.warn(e)
   }
-
   return tablesData
 }
 
@@ -118,7 +128,7 @@ export function getColumnNameMap (tablesData) {
 
   for (const tableData of tablesData) {
     const tableAlias = tableData.alias
-    for (const column of tableData.columns) {
+    for (const column of tableData.all_columns) {
       columnNameMap[`${tableAlias}.${column.name}`] = column
     }
   }
@@ -151,13 +161,7 @@ export function generateModel (modelData) {
     guid: modelData.uuid,
     name: modelData.name,
     alias: modelData.alias,
-    tables: tablesData.map(tableData => ({
-      guid: tableData.guid,
-      name: tableData.table,
-      alias: tableData.alias,
-      type: tableData.kind,
-      spreadOut: true
-    })),
+    tables: tablesData,
     dimensions: dimensionsData.map(dimensionData => ({
       guid: dimensionData.guid,
       name: dimensionData.name,

Reply via email to