You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@age.apache.org by jo...@apache.org on 2022/10/11 01:36:52 UTC

[age-viewer] branch main updated: Improve performance of count of nodes/edges per label (#33)

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

joshinnis pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/age-viewer.git


The following commit(s) were added to refs/heads/main by this push:
     new 22dbb43  Improve performance of count of nodes/edges per label (#33)
22dbb43 is described below

commit 22dbb4394fce0797c3208407d8bb9eba613beef7
Author: marodins <67...@users.noreply.github.com>
AuthorDate: Mon Oct 10 18:36:49 2022 -0700

    Improve performance of count of nodes/edges per label (#33)
    
    Improve the performance of an SQL query that collect metadata about nodes/edges per label
---
 backend/sql/meta_data/AGE.sql                   |  7 +++++
 backend/src/services/databaseService.js         | 39 ++++++++++++++++++++++---
 frontend/src/features/database/MetadataSlice.js |  2 ++
 3 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/backend/sql/meta_data/AGE.sql b/backend/sql/meta_data/AGE.sql
new file mode 100644
index 0000000..36ab8cf
--- /dev/null
+++ b/backend/sql/meta_data/AGE.sql
@@ -0,0 +1,7 @@
+ANALYZE;
+SELECT c.relname AS label, c.reltuples AS cnt
+FROM pg_catalog.pg_class c
+JOIN pg_catalog.pg_namespace n
+ON n.oid = c.relnamespace
+WHERE c.relkind = 'r'
+AND n.nspname = '%s';
\ No newline at end of file
diff --git a/backend/src/services/databaseService.js b/backend/src/services/databaseService.js
index 038e7f6..5dbbc7d 100644
--- a/backend/src/services/databaseService.js
+++ b/backend/src/services/databaseService.js
@@ -20,6 +20,7 @@
 import {getQuery} from "../tools/SQLFlavorManager";
 import * as util from "util";
 import GraphRepository from '../models/GraphRepository';
+import { start } from "repl";
 
 class DatabaseService {
     constructor() {
@@ -28,10 +29,12 @@ class DatabaseService {
 
     async getMetaData() {
         let metadata = {};
+        
         try {
             let connectionInfo = this.getConnectionInfo();
-            metadata.nodes = await this.getNodes();
-            metadata.edges = await this.getEdges();
+            let {nodes, edges} = await this.readMetaData();
+            metadata.nodes = nodes;
+            metadata.edges = edges;
             metadata.propertyKeys = await this.getPropertyKeys();
             metadata.graph = connectionInfo.graph;
             metadata.database = connectionInfo.database;
@@ -68,7 +71,13 @@ class DatabaseService {
 
         return queryResult.rows;
     }
-
+    
+    async readMetaData(){
+        let gr = this._graphRepository;
+        let queryResult = await gr.execute(util.format(getQuery(gr.flavor, 'meta_data'), this.getConnectionInfo().graph));
+        return this.parseMeta(queryResult[1].rows);
+    }
+    /* 
     async getNodes() {
         let graphRepository = this._graphRepository;
         let queryResult = await graphRepository.execute(util.format(getQuery(graphRepository.flavor, 'meta_nodes'), graphRepository._graph, graphRepository._graph));
@@ -80,7 +89,7 @@ class DatabaseService {
         let queryResult = await graphRepository.execute(util.format(getQuery(graphRepository.flavor, 'meta_edges'), graphRepository._graph, graphRepository._graph));
         return queryResult.rows;
     }
-
+    */
     async getPropertyKeys() {
         let graphRepository = this._graphRepository;
         let queryResult = await graphRepository.execute(getQuery(graphRepository.flavor, 'property_keys'));
@@ -165,6 +174,28 @@ class DatabaseService {
             properties: props,
         };
     }
+    parseMeta(data){
+        const meta = {
+            edges:[],
+            nodes:[]
+        };
+        const vertex = '_ag_label_vertex';
+        const edge = '_ag_label_edge';
+        let cur = null;
+        data.forEach((element, index) => {
+            if ( element.label === vertex ){
+                cur = 'nodes';
+            }
+            else if ( element.label === edge ){
+                cur = 'edges';
+            }
+            else{
+                meta[cur].push(element);
+            }
+
+        });
+        return meta;
+    }
 }
 
 module.exports = DatabaseService;
diff --git a/frontend/src/features/database/MetadataSlice.js b/frontend/src/features/database/MetadataSlice.js
index fc62d12..0e37d0a 100644
--- a/frontend/src/features/database/MetadataSlice.js
+++ b/frontend/src/features/database/MetadataSlice.js
@@ -28,6 +28,7 @@ export const getMetaData = createAsyncThunk(
         let allCountEdge = 0;
         let allCountNode = 0;
         const ret = await response.json();
+
         ret.nodes.forEach((item) => {
           allCountNode += item.cnt;
         });
@@ -35,6 +36,7 @@ export const getMetaData = createAsyncThunk(
         ret.edges.forEach((item) => {
           allCountEdge += item.cnt;
         });
+
         ret.nodes.unshift({ label: '*', cnt: allCountNode });
         ret.edges.unshift({ label: '*', cnt: allCountEdge });
         return ret;