Преглед изворни кода

HUE-3450 [metadata] Add relationships section

Romain Rigaux пре 9 година
родитељ
комит
5a74079

+ 17 - 0
apps/metastore/src/metastore/static/metastore/js/metastore.ko.js

@@ -333,6 +333,7 @@
     self.optimizerStats = ko.observable();
     self.navigatorStats = ko.observable();
     self.optimizerDetails = ko.observable();
+    self.relationshipsDetails = ko.observable();
 
     self.loaded = ko.observable(false);
     self.loading = ko.observable(false);
@@ -454,6 +455,8 @@
                 $(document).trigger("error", xhr.responseText);
               });
 
+              self.getRelationships();
+
               $.post('/metadata/api/optimizer_api/table_details', {
                 tableName: self.name
               }, function(data){
@@ -526,6 +529,19 @@
         }
       });
     };
+    
+    self.getRelationships = function () {
+      $.post('/metadata/api/navigator/lineage', {
+        //id: ko.mapping.toJSON(self.navigatorStats().identity)
+    	  id: 'ffacc341a00159f5fd4aa454c28a9e42'
+      }, function(data) {
+        if (data && data.status == 0) {
+          self.relationshipsDetails(ko.mapping.fromJS(data));
+        } else {
+          $(document).trigger("error", data.message);
+        }
+      });
+    };
   }
 
   MetastoreTable.prototype.showImportData = function () {
@@ -607,6 +623,7 @@
     });
 
     self.optimizerUrl = ko.observable(options.optimizerUrl);
+    self.navigatorUrl = ko.observable(options.navigatorUrl);
 
     huePubSub.subscribe("assist.db.panel.ready", function () {
       huePubSub.publish('assist.set.database', {

+ 69 - 14
apps/metastore/src/metastore/templates/metastore.mako

@@ -382,8 +382,8 @@ ${ assist.assistPanel() }
           </div>
         </div>
         <!-- /ko -->
-      
-      <!-- ko if: $root.optimizerEnabled() && $root.database().navigatorStats() && $root.database().navigatorStats().tags -->  
+
+      <!-- ko if: $root.optimizerEnabled() && $root.database().navigatorStats() && $root.database().navigatorStats().tags -->
         <!-- ko template: { name: 'metastore-databases-tags', data: $root.database() }--><!-- /ko -->
       <!-- /ko -->
       </div>
@@ -563,7 +563,7 @@ ${ assist.assistPanel() }
     <!-- ko with: table -->
     <!-- ko if: $root.optimizerEnabled && $root.database().table().optimizerStats() -->
       <a class="inactive-action margin-left-10" title="${_('View in Optimizer')}" data-bind="attr: { 'href': $root.optimizerUrl() + '#/table/' + $root.database().table().optimizerStats().eid }" target="_blank"><i class="fa fa-skyatlas"></i></a>
-    <!-- /ko -->    
+    <!-- /ko -->
 ##     <a class="inactive-action margin-left-10" href="javascript: void(0);"><i class="fa fa-star"></i></a>
     % if has_write_access:
       <a class="inactive-action margin-left-10" href="#" data-bind="click: showImportData, visible: tableDetails() && ! tableDetails().is_view" title="${_('Import Data')}"><i class="fa fa-upload"></i></a>
@@ -762,11 +762,15 @@ ${ assist.assistPanel() }
       <li><a href="#partitions" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-partitions'); }">${_('Partitions')} <span data-bind="text: '(' + partitions.values().length + ')'"></span></a></li>
     <!-- /ko -->
     <li><a href="#sample" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-sample'); }">${_('Sample')}</a></li>
-    <!-- ko if: $root.optimizerEnabled() && $root.database().table().optimizerDetails() -->
+    <!-- ko if: $root.optimizerEnabled() -->
+      <!-- ko if: $root.database().table().optimizerDetails() -->
       <li><a href="#permissions" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-permissions'); }">${_('Permissions')}</a></li>
       <li><a href="#queries" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-queries'); }">${_('Queries')} (<span data-bind="text: $root.database().table().optimizerDetails().total"></span>)</a></li>
       <li><a href="#joins" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-joins'); }">${_('Joins')} (<span data-bind="text: $root.database().table().optimizerDetails().joinCount"></span>)</a></li>
-      <li><a href="#relationships" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-relationships'); }">${_('Relationships')}</a></li>
+      <!-- /ko -->
+      <!-- ko if: $root.database().table().relationshipsDetails() -->
+      <li><a href="#relationships" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-relationships'); }">${_('Relationships')} (<span data-bind="text: $root.database().table().relationshipsDetails().inputs().length + $root.database().table().relationshipsDetails().targets().length"></span>)</a></li>
+      <!-- /ko -->
     <!-- /ko -->
     <li><a href="#details" data-toggle="tab" data-bind="click: function(){ $root.currentTab('table-details'); }">${ _('Details') }</a></li>
   </ul>
@@ -995,7 +999,7 @@ ${ assist.assistPanel() }
             <td class="pointer" data-bind="text: tableEid, click: function(){ window.open($root.optimizerUrl() + '#/table/' + tableEid(), '_blank'); }"></td>
             <td style="height: 10px; width: 70px; margin-top:5px;" data-bind="attr: {'title': joinpercent()}">
               <div class="progress bar" style="background-color: #338bb8" data-bind="style: { 'width' : joinpercent() + '%' }"></div>
-            </td>            
+            </td>
             <td><a data-bind="text: tableName, attr: { href: '/metastore/table/' + $root.database().name + '/' + tableName() }"</a></td>
             <td class="pointer"><code data-bind="text: joinColumns, click: scrollToColumn"></code></td>
             <td data-bind="text: joincount"></td>
@@ -1007,12 +1011,60 @@ ${ assist.assistPanel() }
     </div>
 
     <div class="tab-pane" id="relationships">
-      <!-- ko if: $root.database() && $root.database().table() -->
-        <span data-bind="text: $root.database().table().optimizerDetails()"></span>
-        
-        ## top stats above tags
-        
-        ## col stats, nb# joins on ....
+      <!-- ko if: $root.currentTab() == 'table-relationships' && $root.database().table().relationshipsDetails() -->
+      <!-- ko with: $root.database().table().relationshipsDetails() -->
+       <h4>${ _('Inputs') }</h4>
+       <div class="row-fluid">
+          <!-- ko foreach: inputs -->
+            <div data-bind="text: $data"></div>
+          <!-- /ko -->
+        <!-- ko if: inputs().length == 0 -->
+          ${ _('Not inputs') }
+        <!-- /ko -->
+       </div>
+
+       </br>
+
+       <h4>${ _('Targets') }</h4>
+       <div class="row-fluid">
+        <!-- ko foreach: targets -->
+          <div data-bind="text: $data"></div>
+        <!-- /ko -->
+        <!-- ko if: targets().length == 0 -->
+          ${ _('Not targets') }
+        <!-- /ko -->
+       </div>
+
+       </br>
+
+       <h4>${ _('Source query') }</h4>
+       <div class="row-fluid">
+          <code data-bind="text: source_query"></code>
+       </div>
+
+       </br>
+
+       <h4>${ _('Target queries') }</h4>
+       <div class="row-fluid">
+          <!-- ko foreach: target_queries -->
+            <div>
+              <code data-bind="text: $data"></code>
+            </div>
+          <!-- /ko -->
+        <!-- ko if: target_queries().length == 0 -->
+          ${ _('Not target queries') }
+        <!-- /ko -->
+       </div>
+
+      </br>
+
+      <h4>${ _('Lineage') }</h4>
+      <div class="row-fluid">
+        <button class="btn toolbarBtn" title="${_('Open in Navigator ')}" data-bind="click: function () { window.open($root.navigatorUrl() + '?view=detailsView&id=' + id() + '&b=rFlCX&tab=lineage', '_blank'); }">
+          <i class="fa fa-skyatlas"></i> ${_('View in Navigator')}
+        </button>
+      </div>
+      <!-- /ko -->
       <!-- /ko -->
     </div>
 
@@ -1137,7 +1189,8 @@ ${ assist.assistPanel() }
           errorLoadingTablePreview: '${ _('There was a problem loading the table preview. Please try again.') }'
         },
         optimizerEnabled: '${ is_optimizer_enabled }' === 'True',
-        optimizerUrl: '${ optimizer_url }'
+        optimizerUrl: '${ optimizer_url }',
+        navigatorUrl: '${ navigator_url }'
       };
 
       var viewModel = new MetastoreViewModel(options);
@@ -1148,7 +1201,9 @@ ${ assist.assistPanel() }
       });
 
       viewModel.currentTab.subscribe(function(tab){
-        if (tab == 'table-sample') {
+        if (tab == 'table-relationships') {
+          // viewModel.database().table().getRelationships();
+        } else if (tab == 'table-sample') {
           var selector = '#sample .sample-table';
           if ($(selector).parents('.dataTables_wrapper').length == 0){
             hueUtils.waitForRendered(selector, function(el){ return el.find('td').length > 0 }, function(){

+ 6 - 3
apps/metastore/src/metastore/views.py

@@ -31,7 +31,7 @@ from desktop.lib.django_util import JsonResponse, render
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.models import Document, Document2
 
-from metadata.conf import has_optimizer, get_optimizer_url
+from metadata.conf import has_optimizer, get_optimizer_url, get_navigator_url
 
 from beeswax.design import hql_query
 from beeswax.models import SavedQuery, MetaInstall
@@ -82,6 +82,7 @@ def databases(request):
     'has_write_access': has_write_access(request.user),
     'is_optimizer_enabled': has_optimizer(),
     'optimizer_url': get_optimizer_url(),
+    'navigator_url': get_navigator_url(),
   })
 
 
@@ -182,7 +183,8 @@ def show_tables(request, database=None):
     'partitions': [],
     'has_write_access': has_write_access(request.user),
     'is_optimizer_enabled': has_optimizer(),
-    'optimizer_url': get_optimizer_url()
+    'optimizer_url': get_optimizer_url(),
+    'navigator_url': get_navigator_url(),
     })
 
   return resp
@@ -255,7 +257,8 @@ def describe_table(request, database, table):
       'database': database,
       'has_write_access': has_write_access(request.user),
       'is_optimizer_enabled': has_optimizer(),
-      'optimizer_url': get_optimizer_url()
+      'optimizer_url': get_optimizer_url(),
+      'navigator_url': get_navigator_url(),
     })
 
 

+ 3 - 0
desktop/libs/metadata/src/metadata/conf.py

@@ -41,6 +41,9 @@ def get_optimizer_url():
 def has_optimizer():
   return bool(get_optimizer_url())
 
+def get_navigator_url():
+  return NAVIGATOR.API_URL.get() and NAVIGATOR.API_URL.get().strip('/')[:-3]
+
 
 OPTIMIZER = ConfigSection(
   key='optimizer',