Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 79ebf9a

Browse files
authored
Merge pull request #71 from RedisGraph/readonly-query
add support for readonly queries (#58)
2 parents bff4ed3 + 8a123e4 commit 79ebf9a

File tree

2 files changed

+79
-2
lines changed

2 files changed

+79
-2
lines changed

‎src/graph.js‎

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,37 @@ class Graph {
108108
* @param {Map} [params] Parameters map
109109
* @returns {Promise<ResultSet>} a promise contains a result set
110110
*/
111-
async query(query, params) {
111+
query(query, params) {
112+
return this._query("graph.QUERY", query, params);
113+
}
114+
115+
/**
116+
* Execute a Cypher readonly query
117+
* @async
118+
* @param {string} query Cypher query
119+
* @param {Map} [params] Parameters map
120+
*
121+
* @returns {Promise<ResultSet>} a promise contains a result set
122+
*/
123+
readonlyQuery(query, params) {
124+
return this._query("graph.RO_QUERY", query, params);
125+
}
126+
127+
/**
128+
* Execute a Cypher query
129+
* @private
130+
* @async
131+
* @param {'graph.QUERY'|'graph.RO_QUERY'} command
132+
* @param {string} query Cypher query
133+
* @param {Map} [params] Parameters map
134+
*
135+
* @returns {Promise<ResultSet>} a promise contains a result set
136+
*/
137+
async _query(command, query, params) {
112138
if (params) {
113139
query = this.buildParamsHeader(params) + query;
114140
}
115-
var res = await this._sendCommand("graph.QUERY", [
141+
var res = await this._sendCommand(command, [
116142
this._graphId,
117143
query,
118144
"--compact"

‎test/redisGraphAPITest.js‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,57 @@ describe("RedisGraphAPI Test", () => {
335335
}
336336
});
337337

338+
it("test readonly query", async () => {
339+
// Create both source and destination nodes
340+
await api.query(
341+
"CREATE (r:human {name:'roi', age:34}), (a:human {name:'amit', age:32}), (r)-[:knows]->(a)"
342+
);
343+
// Query
344+
let resultSet = await api.readonlyQuery(
345+
"MATCH (r:human)-[:knows]->(a:human) RETURN r.age, r.name"
346+
);
347+
assert.equal(resultSet.size(), 1);
348+
assert.ok(resultSet.hasNext());
349+
assert.equal(0, resultSet.getStatistics().nodesCreated());
350+
assert.equal(0, resultSet.getStatistics().nodesDeleted());
351+
assert.equal(0, resultSet.getStatistics().labelsAdded());
352+
assert.equal(0, resultSet.getStatistics().propertiesSet());
353+
assert.equal(0, resultSet.getStatistics().relationshipsCreated());
354+
assert.equal(0, resultSet.getStatistics().relationshipsDeleted());
355+
assert.ok(
356+
resultSet
357+
.getStatistics()
358+
.getStringValue(Label.QUERY_INTERNAL_EXECUTION_TIME)
359+
);
360+
361+
assert.deepStrictEqual(["r.age", "r.name"], resultSet.getHeader());
362+
363+
let record = resultSet.next();
364+
assert.equal(34, record.get(0));
365+
assert.equal("34", record.getString(0));
366+
assert.equal("roi", record.getString(1));
367+
assert.equal("roi", record.getString("r.name"));
368+
369+
assert.deepStrictEqual(["r.age", "r.name"], record.keys());
370+
assert.deepStrictEqual([34, "roi"], record.values());
371+
assert.equal(false, record.containsKey("aa"));
372+
assert.equal(true, record.containsKey("r.name"));
373+
assert.equal(2, record.size());
374+
});
375+
376+
it("test readonly query exception", async () => {
377+
assert.rejects(
378+
() => api.readonlyQuery(
379+
"CREATE (r:human {name:'roi', age:34}), (a:human {name:'amit', age:32}), (r)-[:knows]->(a)"
380+
),
381+
err => {
382+
assert.strictEqual(err.name, 'ReplyError');
383+
assert.strictEqual(err.message, 'graph.RO_QUERY is to be executed only on read-only queries');
384+
return true;
385+
}
386+
);
387+
});
388+
338389
it("testCompileTimeException", async () => {
339390
await api.query("CREATE ()");
340391
try {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /