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;