You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@age.apache.org by hb...@apache.org on 2022/12/29 04:23:28 UTC

[age-viewer] branch main updated: Graphname metadata (#56)

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

hbshin 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 19d6c1e  Graphname metadata (#56)
19d6c1e is described below

commit 19d6c1e4480e3e8553f1c6d81572374bb74dc6c5
Author: MJinH <97...@users.noreply.github.com>
AuthorDate: Wed Dec 28 20:23:22 2022 -0800

    Graphname metadata (#56)
    
    * added hover effect on refresh/close buttons; added block element to have fixed size of select box and prevent text from taking more than 1 line when graph name is short; modified css of editor for auto-expanding textarea; removed white space in new line when pressing enter after copying and pasting
    
    * changed max-height to 600px; resize grabber icon on the bottom right coner was missing
    
    * select box which grap to show metadata information for
    
    * Revert "select box which grap to show metadata information for"
    
    This reverts commit 9e39d63f8cc0f77e3864a68528c5116caa929805.
    
    * removed max-height; added scroll bar to editor div so that a user can move the content up and down when having a lot of text inside
    
    * metadata for single graph
    
    Co-authored-by: moon19960501@gmail.com <we...@gmail.com>
    Co-authored-by: Hanbyeol Shin /  David Shin / 신한별 <76...@users.noreply.github.com>
---
 backend/src/controllers/databaseController.js      |  2 +-
 backend/src/routes/databaseRouter.js               |  5 +-
 backend/src/services/databaseService.js            | 61 ++++++++++++++--------
 .../src/components/contents/containers/Contents.js |  1 +
 .../components/contents/presentations/Contents.jsx |  8 +--
 .../frame/containers/ServerConnectContainer.js     |  4 +-
 .../frame/presentations/ServerConnectFrame.jsx     |  4 +-
 .../components/sidebar/containers/SidebarHome.js   |  1 +
 .../sidebar/presentations/SidebarHome.jsx          |  4 +-
 frontend/src/features/database/MetadataSlice.js    | 20 ++++---
 10 files changed, 71 insertions(+), 39 deletions(-)

diff --git a/backend/src/controllers/databaseController.js b/backend/src/controllers/databaseController.js
index 995f578..83cf077 100644
--- a/backend/src/controllers/databaseController.js
+++ b/backend/src/controllers/databaseController.js
@@ -58,7 +58,7 @@ class DatabaseController {
     async getMetadata(req, res, next) {
         let databaseService = sessionService.get(req.sessionID);
         if (databaseService.isConnected()) {
-            let metadata = await databaseService.getMetaData();
+            let metadata = await databaseService.getMetaData(req.body);
             res.status(200).json(metadata).end();
         } else {
             throw new Error('Not connected');
diff --git a/backend/src/routes/databaseRouter.js b/backend/src/routes/databaseRouter.js
index e45668a..d53501b 100644
--- a/backend/src/routes/databaseRouter.js
+++ b/backend/src/routes/databaseRouter.js
@@ -26,7 +26,6 @@ const {wrap} = require('../common/Routes');
 router.get("/", wrap(databaseController.getStatus));
 router.post("/connect", wrap(databaseController.connectDatabase));
 router.get("/disconnect", wrap(databaseController.disconnectDatabase));
-router.get("/meta", wrap(databaseController.getMetadata));
-// router.get("/metaChart", wrap(databaseController.getMetaChart));
-
+router.post("/meta", wrap(databaseController.getMetadata));
+router.get("/metaChart", wrap(databaseController.getMetaChart));
 module.exports = router;
diff --git a/backend/src/services/databaseService.js b/backend/src/services/databaseService.js
index 8e63d60..7e35048 100644
--- a/backend/src/services/databaseService.js
+++ b/backend/src/services/databaseService.js
@@ -28,46 +28,61 @@ class DatabaseService {
     }
 
     async getMetaData(graphName) {
+        const { currentGraph } = graphName;
         await this._graphRepository.initGraphNames();
         const {graphs} = this._graphRepository.getConnectionInfo();
-        if(graphName){
-            if(graphs.includes(graphName)){
-                return await this.getMetaDataSingle(graphName);
-            }else{
-                throw new Error('graph does not exist');
+
+        if(currentGraph){
+            if(graphs.includes(currentGraph)){
+                return await this.getMetaDataSingle(currentGraph,graphs);
             }
-            
-        }else{
-            return await this.getMetaDataMultiple(graphs);
+        } else if(graphs.length > 0) {
+            return await this.graphNameInitialize(graphs);
+        } else{
+            throw new Error('graph does not exist');
+            // return await this.getMetaDataMultiple(graphs);
         }
 
     }
 
-    async getMetaDataMultiple(graphs){
-        const metadata = {};
-        await Promise.all(graphs.map(async(gname)=>{
-            metadata[gname] = await this.getMetaDataSingle(gname);
-        }))
-        return metadata;
-    }
+    // async getMetaDataMultiple(graphs){
+    //     const metadata = {};
+    //     await Promise.all(graphs.map(async(gname)=>{
+    //         metadata[gname] = await this.getMetaDataSingle(gname);
+    //     }))
+    //     return metadata;
+    // }
 
-    async getMetaDataSingle(curGraph){
+    async getMetaDataSingle(curGraph, graphs){
         let metadata = {};
+        let data = {};
         const {database} = this.getConnectionInfo();
         try {
             let {nodes, edges} = await this.readMetaData(curGraph);
-            metadata.nodes = nodes;
-            metadata.edges = edges;
-            metadata.propertyKeys = await this.getPropertyKeys();
-            metadata.graph = curGraph;
-            metadata.database = database;
-            metadata.role = await this.getRole();
+            data.nodes = nodes;
+            data.edges = edges;
+            data.propertyKeys = await this.getPropertyKeys();
+            data.graph = curGraph;
+            data.database = database;
+            data.role = await this.getRole();
+            metadata[curGraph] = data;
+            graphs.forEach((gname) => {
+                if(gname !== curGraph) metadata[gname] = {};
+            })
         } catch (error) {
             throw error;
         }
         return metadata;
     }
-    /*
+
+    async graphNameInitialize(graphs) {
+        let metadata = {};
+        graphs.forEach((gname) => {
+            metadata[gname] = {};
+        })
+        return metadata;
+    }
+
     async getGraphLabels() {
         let graphRepository = this._graphRepository;
         let queryResult = {};
diff --git a/frontend/src/components/contents/containers/Contents.js b/frontend/src/components/contents/containers/Contents.js
index 8f70726..d14346d 100644
--- a/frontend/src/components/contents/containers/Contents.js
+++ b/frontend/src/components/contents/containers/Contents.js
@@ -25,6 +25,7 @@ import Contents from '../presentations/Contents';
 const mapStateToProps = (state) => ({
   database: state.database,
   isActive: state.navigator.isActive,
+  currentGraph: state.metadata.currentGraph,
 });
 
 const mapDispatchToProps = { getConnectionStatus, getMetaData /* getMetaChartData */ };
diff --git a/frontend/src/components/contents/presentations/Contents.jsx b/frontend/src/components/contents/presentations/Contents.jsx
index d25d0a1..ebc0bde 100644
--- a/frontend/src/components/contents/presentations/Contents.jsx
+++ b/frontend/src/components/contents/presentations/Contents.jsx
@@ -24,7 +24,7 @@ import FramesContainer from '../containers/Frames';
 import styles from './Contents.module.scss';
 
 const Contents = ({
-  database, isActive, getConnectionStatus, getMetaData, /* getMetaChartData, */
+  database, isActive, getConnectionStatus, getMetaData, getMetaChartData, currentGraph,
 }) => {
   const dispatch = useDispatch();
 
@@ -33,8 +33,9 @@ const Contents = ({
       dispatch(() => {
         getConnectionStatus().then((response) => {
           if (response.type === 'database/getConnectionStatus/fulfilled') {
+            getMetaData({ currentGraph });
+            getMetaChartData();
             getMetaData();
-            /* getMetaChartData(); */
           }
         });
       });
@@ -57,7 +58,8 @@ Contents.propTypes = {
   isActive: PropTypes.bool.isRequired,
   getConnectionStatus: PropTypes.func.isRequired,
   getMetaData: PropTypes.func.isRequired,
-  /* getMetaChartData: PropTypes.func.isRequired, */
+  getMetaChartData: PropTypes.func.isRequired,
+  currentGraph: PropTypes.string.isRequired,
 };
 
 export default Contents;
diff --git a/frontend/src/components/frame/containers/ServerConnectContainer.js b/frontend/src/components/frame/containers/ServerConnectContainer.js
index 50a16ae..9746f7c 100644
--- a/frontend/src/components/frame/containers/ServerConnectContainer.js
+++ b/frontend/src/components/frame/containers/ServerConnectContainer.js
@@ -26,7 +26,9 @@ import {
 import { addAlert } from '../../../features/alert/AlertSlice';
 import ServerConnectFrame from '../presentations/ServerConnectFrame';
 
-const mapStateToProps = () => ({});
+const mapStateToProps = (state) => ({
+  currentGraph: state.metadata.currentGraph,
+});
 
 const mapDispatchToProps = {
   connectToDatabase,
diff --git a/frontend/src/components/frame/presentations/ServerConnectFrame.jsx b/frontend/src/components/frame/presentations/ServerConnectFrame.jsx
index f5bb3f6..514ac26 100644
--- a/frontend/src/components/frame/presentations/ServerConnectFrame.jsx
+++ b/frontend/src/components/frame/presentations/ServerConnectFrame.jsx
@@ -44,6 +44,7 @@ const ServerConnectFrame = ({
   refKey,
   isPinned,
   reqString,
+  currentGraph,
 }) => {
   const dispatch = useDispatch();
 
@@ -51,7 +52,7 @@ const ServerConnectFrame = ({
     if (response.type === 'database/connectToDatabase/fulfilled') {
       dispatch(addAlert('NoticeServerConnected'));
       dispatch(trimFrame('ServerConnect'));
-      dispatch(getMetaData()).then((metadataResponse) => {
+      dispatch(getMetaData({ currentGraph })).then((metadataResponse) => {
         if (metadataResponse.type === 'database/getMetaData/fulfilled') {
           const graphName = Object.keys(metadataResponse.payload)[0];
           /* dispatch(getMetaChartData()); */
@@ -116,6 +117,7 @@ ServerConnectFrame.propTypes = {
   refKey: PropTypes.string.isRequired,
   isPinned: PropTypes.bool.isRequired,
   reqString: PropTypes.string.isRequired,
+  currentGraph: PropTypes.string.isRequired,
 };
 
 export default ServerConnectFrame;
diff --git a/frontend/src/components/sidebar/containers/SidebarHome.js b/frontend/src/components/sidebar/containers/SidebarHome.js
index 5336079..0445c29 100644
--- a/frontend/src/components/sidebar/containers/SidebarHome.js
+++ b/frontend/src/components/sidebar/containers/SidebarHome.js
@@ -36,6 +36,7 @@ const mapStateToProps = (state) => {
     status: state.metadata.status,
     role: currentGraphData.role,
     command: state.editor.command,
+    currentGraph: state.metadata.currentGraph,
     isLabel: state.layout.isLabel,
   };
 };
diff --git a/frontend/src/components/sidebar/presentations/SidebarHome.jsx b/frontend/src/components/sidebar/presentations/SidebarHome.jsx
index a96ee40..39e0b1e 100644
--- a/frontend/src/components/sidebar/presentations/SidebarHome.jsx
+++ b/frontend/src/components/sidebar/presentations/SidebarHome.jsx
@@ -363,6 +363,7 @@ const SidebarHome = ({
   getMetaData,
   changeCurrentGraph,
   changeGraph,
+  currentGraph,
   isLabel,
 }) => {
   const dispatch = useDispatch();
@@ -375,7 +376,7 @@ const SidebarHome = ({
   };
 
   const refreshSidebarHome = () => {
-    getMetaData();
+    getMetaData({ currentGraph });
   };
 
   return (
@@ -503,6 +504,7 @@ SidebarHome.propTypes = {
   currentGraph: PropTypes.string.isRequired,
   graphs: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)).isRequired,
   changeGraph: PropTypes.func.isRequired,
+  currentGraph: PropTypes.string.isRequired,
   isLabel: PropTypes.bool.isRequired,
 };
 
diff --git a/frontend/src/features/database/MetadataSlice.js b/frontend/src/features/database/MetadataSlice.js
index 92f35b6..67836f1 100644
--- a/frontend/src/features/database/MetadataSlice.js
+++ b/frontend/src/features/database/MetadataSlice.js
@@ -22,23 +22,31 @@ import uuid from 'react-uuid';
 
 export const getMetaData = createAsyncThunk(
   'database/getMetaData',
-  async () => {
+  async (arg) => {
     try {
-      const response = await fetch('/api/v1/db/meta');
+      const response = await fetch('/api/v1/db/meta',
+        {
+          method: 'POST',
+          headers: {
+            Accept: 'application/json',
+            'Content-Type': 'application/json',
+          },
+          body: JSON.stringify(arg),
+        });
       if (response.ok) {
         const ret = await response.json();
         Object.keys(ret).forEach((gname) => {
           let allCountEdge = 0;
           let allCountNode = 0;
-          ret[gname].nodes.forEach((item) => {
+          ret[gname].nodes?.forEach((item) => {
             allCountNode += item.cnt;
           });
 
-          ret[gname].edges.forEach((item) => {
+          ret[gname].edges?.forEach((item) => {
             allCountEdge += item.cnt;
           });
-          ret[gname].nodes.unshift({ label: '*', cnt: allCountNode });
-          ret[gname].edges.unshift({ label: '*', cnt: allCountEdge });
+          ret[gname].nodes?.unshift({ label: '*', cnt: allCountNode });
+          ret[gname].edges?.unshift({ label: '*', cnt: allCountEdge });
           ret[gname].id = uuid();
         });
         return ret;