From 6c9b193b7f6db53aa655e21dde75a83fdbeb8239 Mon Sep 17 00:00:00 2001 From: DvirDukhan Date: Wed, 20 Nov 2019 10:49:03 +0200 Subject: [PATCH 1/6] added parameters support --- src/graph.js | 39 +++++++++++++++++++++++++++++++++++++-- test/redisGraphAPITest.js | 20 ++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/graph.js b/src/graph.js index 4b75506d34..b3a174307b 100644 --- a/src/graph.js +++ b/src/graph.js @@ -44,15 +44,50 @@ class Graph { strings.push(resultSet.next().getString(0)); } return strings; - } + } + + paramToString(paramValue) { + let paramType = typeof(paramValue); + if(paramType == "string") { + let strValue = ""; + if (paramValue[0] != "\"") + strValue += "\""; + strValue += paramValue; + if(paramValue[paramValue.length-1] != "\"") + strValue += "\""; + return strValue; + } + if(Array.isArray(paramValue)) + return "[" + paramValue.toString() + "]"; + return paramValue; + } + + /** + * Extracts parameters from dictionary into cypher parameters string. + * + * @param params parameters dictionary. + * @return a cypher parameters string. + */ + buildParamsHeader(params) { + let paramsHeader = "CYPHER "; + for (var key in params) { + let value = this.paramToString(params[key]); + paramsHeader += `${key}=${value} `; + } + return paramsHeader; + } /** * Execute a Cypher query (async) * * @param query Cypher query + * @param params Parameters map * @return a promise contains a result set */ - async query(query) { + async query(query, params) { + if(params){ + query = this.buildParamsHeader(params) + query; + } var res = await this._sendCommand("graph.QUERY", [this._graphId, query, "--compact"]); var resultSet = new ResultSet(this); return resultSet.parseResponse(res); diff --git a/test/redisGraphAPITest.js b/test/redisGraphAPITest.js index 687cedde76..08efa089c7 100644 --- a/test/redisGraphAPITest.js +++ b/test/redisGraphAPITest.js @@ -358,4 +358,24 @@ describe('RedisGraphAPI Test', function () { }) }) + it('testParam', (done) => { + let params = [1, 2.3, true, false, null, "str", [1,2,3]]; + let promises =[]; + for (var i =0; i < params.length; i++){ + let param = {'param':params[i]}; + promises.push(api.query("RETURN $param", param)); + } + Promise.all(promises).then(values => { + for (var i =0; i < values.length; i++) { + let resultSet = values[i]; + let record = resultSet.next(); + let param = record.get(0); + assert.deepEqual(param, params[i]); + } + done(); + }).catch(error => { + console.log(error); + }) + + }) }); From c42f955349ab7777e1b0f8e3e85d62956f901ef1 Mon Sep 17 00:00:00 2001 From: DvirDukhan Date: Wed, 20 Nov 2019 11:02:27 +0200 Subject: [PATCH 2/6] added examples and README --- README.md | 17 ++++++++++++----- examples/package.json | 2 +- examples/redisGraphExample.js | 17 ++++++++++++----- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2ca803e505..8541c20516 100644 --- a/README.md +++ b/README.md @@ -43,14 +43,21 @@ graph.query("CREATE (:person{name:'roi',age:32})").then(() => { console.log(record.get("a.name")); } console.log(res.getStatistics().queryExecutionTime()); - graph.query("MATCH p = (a:person)-[:knows]->(:person) RETURN p").then(res=>{ + let param = {'age': 30}; + graph.query("MATCH (a {age: $age}) return a.name", param).then(res=>{ while (res.hasNext()) { let record = res.next(); - // See path.js for more path API. - console.log(record.get("p").nodeCount); - graph.deleteGraph(); - process.exit(); + console.log(record.get("a.name")); } + graph.query("MATCH p = (a:person)-[:knows]->(:person) RETURN p").then(res=>{ + while (res.hasNext()) { + let record = res.next(); + // See path.js for more path API. + console.log(record.get("p").nodeCount); + graph.deleteGraph(); + process.exit(); + } + }) }) }) }) diff --git a/examples/package.json b/examples/package.json index 56e2af965f..3a2c965ca4 100644 --- a/examples/package.json +++ b/examples/package.json @@ -9,7 +9,7 @@ "url": "git://github.com/redislabs/redisgraph.js.git" }, "dependencies": { - "redisgraph.js": "^1.1.3" + "redisgraph.js": "git://github.com/RedisGraph/redisgraph.js.git" }, "main": "redisGraphExample.js" } diff --git a/examples/redisGraphExample.js b/examples/redisGraphExample.js index 00c92d8042..dac36f4ed9 100644 --- a/examples/redisGraphExample.js +++ b/examples/redisGraphExample.js @@ -11,14 +11,21 @@ graph.query("CREATE (:person{name:'roi',age:32})").then(() => { console.log(record.get("a.name")); } console.log(res.getStatistics().queryExecutionTime()); - graph.query("MATCH p = (a:person)-[:knows]->(:person) RETURN p").then(res=>{ + let param = {'age': 30}; + graph.query("MATCH (a {age: $age}) return a.name", param).then(res=>{ while (res.hasNext()) { let record = res.next(); - // See path.js for more path API. - console.log(record.get("p").nodeCount); - graph.deleteGraph(); - process.exit(); + console.log(record.get("a.name")); } + graph.query("MATCH p = (a:person)-[:knows]->(:person) RETURN p").then(res=>{ + while (res.hasNext()) { + let record = res.next(); + // See path.js for more path API. + console.log(record.get("p").nodeCount); + graph.deleteGraph(); + process.exit(); + } + }) }) }) }) From be68841cd4feac0626735224df7ee636c7e8ebaf Mon Sep 17 00:00:00 2001 From: DvirDukhan Date: Wed, 20 Nov 2019 11:47:11 +0200 Subject: [PATCH 3/6] added support for null parameter --- src/graph.js | 2 ++ test/redisGraphAPITest.js | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/graph.js b/src/graph.js index b3a174307b..927dfe837d 100644 --- a/src/graph.js +++ b/src/graph.js @@ -47,6 +47,8 @@ class Graph { } paramToString(paramValue) { + if(paramValue == null) + return "null" let paramType = typeof(paramValue); if(paramType == "string") { let strValue = ""; diff --git a/test/redisGraphAPITest.js b/test/redisGraphAPITest.js index 08efa089c7..7dc52006ce 100644 --- a/test/redisGraphAPITest.js +++ b/test/redisGraphAPITest.js @@ -359,7 +359,7 @@ describe('RedisGraphAPI Test', function () { }) it('testParam', (done) => { - let params = [1, 2.3, true, false, null, "str", [1,2,3]]; + let params = [1, 2.3, true, false, null, "str", [1,2,3], null]; let promises =[]; for (var i =0; i < params.length; i++){ let param = {'param':params[i]}; @@ -376,6 +376,5 @@ describe('RedisGraphAPI Test', function () { }).catch(error => { console.log(error); }) - }) }); From f1a379824b229502a0d897b1799b91d485b3c611 Mon Sep 17 00:00:00 2001 From: DvirDukhan Date: Mon, 25 Nov 2019 08:56:11 +0200 Subject: [PATCH 4/6] fixed PR comments --- examples/package.json | 2 +- src/graph.js | 8 +++++--- test/redisGraphAPITest.js | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/examples/package.json b/examples/package.json index 3a2c965ca4..f1de96eb7e 100644 --- a/examples/package.json +++ b/examples/package.json @@ -9,7 +9,7 @@ "url": "git://github.com/redislabs/redisgraph.js.git" }, "dependencies": { - "redisgraph.js": "git://github.com/RedisGraph/redisgraph.js.git" + "redisgraph.js": "^1.2.0" }, "main": "redisGraphExample.js" } diff --git a/src/graph.js b/src/graph.js index 927dfe837d..aa96d01c19 100644 --- a/src/graph.js +++ b/src/graph.js @@ -71,12 +71,14 @@ class Graph { * @return a cypher parameters string. */ buildParamsHeader(params) { - let paramsHeader = "CYPHER "; + let paramsArray = ["CYPHER"] + for (var key in params) { let value = this.paramToString(params[key]); - paramsHeader += `${key}=${value} `; + paramsArray.push(`${key}=${value}`); } - return paramsHeader; + paramsArray.push(' '); + return paramsArray.join(' '); } /** diff --git a/test/redisGraphAPITest.js b/test/redisGraphAPITest.js index 7dc52006ce..fa99835b39 100644 --- a/test/redisGraphAPITest.js +++ b/test/redisGraphAPITest.js @@ -359,7 +359,7 @@ describe('RedisGraphAPI Test', function () { }) it('testParam', (done) => { - let params = [1, 2.3, true, false, null, "str", [1,2,3], null]; + let params = [1, 2.3, true, false, null, "str", [1,2,3], ["1", "2", "3"], null]; let promises =[]; for (var i =0; i < params.length; i++){ let param = {'param':params[i]}; @@ -377,4 +377,19 @@ describe('RedisGraphAPI Test', function () { console.log(error); }) }) + it('testMissingParameter', (done)=> { + api.query("RETURN $param").then(response => assert(false)).catch (err => { + assert(err instanceof redis.ReplyError); + assert.equal(err.message, "Missing parameters"); + api.query("RETURN $param", null).then(response => assert(false)).catch (err => { + assert(err instanceof redis.ReplyError); + assert.equal(err.message, "Missing parameters"); + api.query("RETURN $param", {}).then(response => assert(false)).catch (err => { + assert(err instanceof redis.ReplyError); + assert.equal(err.message, "Missing parameters"); + done(); + }) + }) + }) + }) }); From 16cedcb01de3fb6dfbbc0f3418dd6d7459e692e8 Mon Sep 17 00:00:00 2001 From: DvirDukhan Date: Mon, 25 Nov 2019 09:52:14 +0200 Subject: [PATCH 5/6] added quates for strings array --- src/graph.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/graph.js b/src/graph.js index aa96d01c19..1950ff68c2 100644 --- a/src/graph.js +++ b/src/graph.js @@ -59,8 +59,13 @@ class Graph { strValue += "\""; return strValue; } - if(Array.isArray(paramValue)) - return "[" + paramValue.toString() + "]"; + if(Array.isArray(paramValue)) { + let stringsArr = new Array(paramValue.length); + for(var i = 0; i < paramValue.length; i++) { + stringsArr[i] = this.paramToString(paramValue[i]); + } + return "[" + stringsArr.join(", ") + "]"; + } return paramValue; } From 571e0aba99a769b4c9af150df3f02e5e83eded6b Mon Sep 17 00:00:00 2001 From: DvirDukhan Date: Tue, 26 Nov 2019 08:59:33 +0200 Subject: [PATCH 6/6] fixed PR comments --- src/graph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph.js b/src/graph.js index 1950ff68c2..5467f43535 100644 --- a/src/graph.js +++ b/src/graph.js @@ -64,7 +64,7 @@ class Graph { for(var i = 0; i < paramValue.length; i++) { stringsArr[i] = this.paramToString(paramValue[i]); } - return "[" + stringsArr.join(", ") + "]"; + return ["[", stringsArr.join(", "),"]"].join(""); } return paramValue; }