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

ako pushed a commit to branch ageviewer_go
in repository https://gitbox.apache.org/repos/asf/age.git


The following commit(s) were added to refs/heads/ageviewer_go by this push:
     new 65797a5e Output formate change as required in the frontend (#1011)
65797a5e is described below

commit 65797a5e006e04cca3458725219b35313ffefc78
Author: Kamlesh Kumar <[email protected]>
AuthorDate: Tue Jul 25 18:24:15 2023 +0500

    Output formate change as required in the frontend (#1011)
---
 backend/APIfunctions.js          |  8 +++--
 backend/miscellaneous/cypher.go  | 66 ++++++++++++++++++++++++++++++++++------
 backend/miscellaneous/results.go |  9 ++++--
 backend/routes/query.go          |  2 +-
 4 files changed, 69 insertions(+), 16 deletions(-)

diff --git a/backend/APIfunctions.js b/backend/APIfunctions.js
index 34ef1c0e..13b05440 100644
--- a/backend/APIfunctions.js
+++ b/backend/APIfunctions.js
@@ -32,7 +32,6 @@ function connect() {
     body: JSON.stringify(conn),
   })
     .then((response) => {
-      s;
 
       // Store the cookies from the response
       cookies = response.headers.raw()['set-cookie'];
@@ -59,6 +58,7 @@ function queryMetadata() {
       return response.json();
     })
     .then((data) => {
+      console.log(data); 
       // visualize the data in formatted ways
     })
     .catch((error) => {
@@ -69,7 +69,7 @@ function queryMetadata() {
 function query() {
   const payload = {
     query:
-      "SELECT * FROM cypher('demo_graph', $$ MATCH (v) RETURN v $$) as (v 
agtype);",
+      "SELECT * from cypher('test_graph', $$ MATCH (V)-[R]-(V2) RETURN V,R,V2 
$$) as (V agtype, R agtype, V2 agtype);      ",
   };
 
   fetch('http://localhost:8080/query', {
@@ -83,7 +83,9 @@ function query() {
     .then((response) => {
       return response.json();
     })
-    .then((data) => {})
+    .then((data) => {
+      console.log("Query result: ", JSON.stringify(data, null, 2));
+    })
     .catch((error) => {
       console.error(error);
     });
diff --git a/backend/miscellaneous/cypher.go b/backend/miscellaneous/cypher.go
index 2bad06bc..fe2eb27c 100644
--- a/backend/miscellaneous/cypher.go
+++ b/backend/miscellaneous/cypher.go
@@ -2,14 +2,36 @@ package miscellaneous
 
 import (
        "database/sql"
+       "encoding/json"
+       "fmt"
+       "strings"
 )
 
+type Vertex struct {
+       ID         int64                  `json:"id"`
+       Label      string                 `json:"label"`
+       Properties map[string]interface{} `json:"properties"`
+}
+
+type Edge struct {
+       ID         int64                  `json:"id"`
+       Label      string                 `json:"label"`
+       EndID      int64                  `json:"end_id"`
+       StartID    int64                  `json:"start_id"`
+       Properties map[string]interface{} `json:"properties"`
+}
+
+type Row struct {
+       V  Vertex `json:"v"`
+       R  Edge   `json:"r"`
+       V2 Vertex `json:"v2"`
+}
+
 func CypherCall(db *sql.DB, q map[string]string, c chan<- ChannelResults) {
        data := ChannelResults{}
-       results := []interface{}{}
+       var results []map[string]interface{}
        rows, err := db.Query(q["query"])
        if err != nil {
-               data.Err = err
                c <- data
                return
        }
@@ -21,20 +43,46 @@ func CypherCall(db *sql.DB, q map[string]string, c chan<- 
ChannelResults) {
                c <- data
                return
        }
+       columns := make([]string, len(cols))
+       for i, col := range cols {
+               columns[i] = col.Name()
+       }
+       data.Columns = columns
+       data.Command = "SELECT"
 
        for rows.Next() {
-               rawData := make([]any, len(cols))
+               rawResult := make([]interface{}, len(cols))
+               result := make(map[string]interface{})
                for i := 0; i < len(cols); i++ {
-                       rawData[i] = new(string)
+                       rawResult[i] = new(string)
                }
-
-               err := rows.Scan(rawData...)
+               err := rows.Scan(rawResult...)
                if err != nil {
                        data.Err = err
-                       break
+                       c <- data
+                       return
+               }
+               for i, raw := range rawResult {
+                       str := *raw.(*string)
+
+                       // split the string at "::" and only keep the first 
part (the JSON)
+                       parts := strings.SplitN(str, "::", 2)
+                       jsonStr := parts[0]
+
+                       var val interface{}
+                       err := json.Unmarshal([]byte(jsonStr), &val)
+                       if err != nil {
+                               fmt.Println("Failed to unmarshal value:", err)
+                               c <- data
+                               return
+                       }
+
+                       result[columns[i]] = val
                }
-               results = append(results, rawData)
+
+               results = append(results, result)
        }
-       data.Res = results
+       data.Rows = results
+       data.RowCount = len(results)
        c <- data
 }
diff --git a/backend/miscellaneous/results.go b/backend/miscellaneous/results.go
index 963fd404..d8889f18 100644
--- a/backend/miscellaneous/results.go
+++ b/backend/miscellaneous/results.go
@@ -1,7 +1,10 @@
 package miscellaneous
 
 type ChannelResults struct {
-       Res any
-       Msg map[string]string
-       Err error
+       Rows     []map[string]interface{} `json:"rows"`
+       Columns  []string                 `json:"columns"`
+       Err      error                    `json:"error,omitempty"`
+       Msg      map[string]string        `json:"message,omitempty"`
+       RowCount int                      `json:"rowCount"`
+       Command  string                   `json:"command"`
 }
diff --git a/backend/routes/query.go b/backend/routes/query.go
index c5da65ff..a76f92e3 100644
--- a/backend/routes/query.go
+++ b/backend/routes/query.go
@@ -86,7 +86,7 @@ func Cypher(ctx echo.Context) error {
        m.CypherCall(conn, q, c)
        data := <-c
        err = data.Err
-       res := data.Res
+       res := data
        msg := data.Msg
        if err != nil {
                return echo.NewHTTPError(400, fmt.Sprintf("unable to process 
query. error: %s", err.Error()))

Reply via email to