A SQL parser and executer for Cosmos DB.
const { default: query } = require("@zeit/cosmosdb-query");
const items = [
{ id: "foo" },
{ id: "bar" }
];
const { result } = query("SELECT * FROM c WHERE c.id = @id")
.exec(items, {
parameters: [{ name: "@id", value: "foo" }]
});
console.log(result); // [ { id: "foo" } ]
sql
<string>- Returns: <Query>
const q = query("SELECT * FROM c")
items
<Object[]> | <null>options
<Object>parameters
<Object[]> The parameters to pass to queryudf
<Object>maxItemCount
<number> The number of items to return at a timecontinuation
<Object> Continuation tokencompositeIndexes
<Object[][]> Optional composite index definitions for validating multipleORDER BY
properties. By default, no definition is required and this value is used only for validation.
- Returns: <Object>
result
<Object[]> Result documentscontinuation
<Object> Continuation token for subsequent calls
Executes a query for items
.
query(`SELECT VALUE udf.REGEX_MATCH("foobar", ".*bar")`).exec([], {
udf: {
REGEX_MATCH(input, pattern) {
return input.match(pattern) !== null
}
}
});
When the maxItemCount
and/or continuation
options are used,
all itesms have to contain the _rid
field with unique values.
const items = [
{ _rid: "a", value: 1 },
{ _rid: "b", value: 2 },
{ _rid: "c", value: 3 }
];
const q = query(`SELECT * FROM c`);
const { result, continuation } = q.exec(items, { maxItemCount: 2 });
console.log(result); // [ { _rid: "a", value: 1 }, { _rid: "b", value: 2 } ]
const { result: result2 } = q.exec(items, { maxItemCount: 2, continuation });
console.log(result2); // [ { _rid: "c", value: 3 } ]
keys
<string[]>- Returns: <boolean>
Determines whether query may contain partition keys.
const q = query("SELECT * FROM c WHERE c.id = 1");
if (!q.containsPartitionKeys(["/key"])) {
throw new Error("query doesn't contain partition keys");
}
- <Object>
The AST object of query.
const { default: query, SyntaxError } = require("@zeit/cosmosdb-query");
try {
query("INVALID SELECT").exec(items);
} catch (err) {
if (err instanceof SyntaxError) {
console.error(err);
}
throw err;
}
All queries are supported except spatial functions ST_ISVALID
and ST_ISVALIDDETAILED
.
The spatial functions ST_INTERSECTS
, ST_WITHIN
, and ST_DISTANCE
are supported; use parameters to pass in GeoJSON as strings. Items in collections that are GeoJSON are expected to be of type string.
cosmosdb-query's People
cosmosdb-query's Issues
Inverted ARRAY_CONTAINS fails to find any documents
{
id: '123',
userId: uid,
teamId: 'a',
name: 'secret',
value: 'abc'.toString('base64'),
created: Date.now()
}
SELECT * FROM c WHERE ARRAY_CONTAINS(@names, c.name)
where names: ['secret']
DISTINCT does not support
For example i have query like: SELECT DISTINCT c.type FROM c WHERE c.someField ='someValue'
I getting error:
Expected ",", "--", "FROM", "ORDER", "WHERE", [ \t\n\r], [a-zA-Z0-9_], or end of input but "." found.
Subquery incorrectly transformed
Input:
SELECT
COUNT(1)
FROM (
SELECT c.name
FROM c
WHERE
c.name = 'READY'
) AS c
Output:
SELECT COUNT(1)
FROM (
SELECT c.name
FROM c
WHERE (
c.name = 'READY'
)
AS c
) AND (NOT IS_DEFINED(c.deletedAt) OR IS_NULL(c.deletedAt))
Without the inner WHERE
clause it works.
OFFSET & LIMIT not supported
Attempting to execute the following query
SELECT VALUE root
FROM root
WHERE (root["value"] = "value2")
OFFSET 0 LIMIT 1
will throw the following exception
{
"message": "Expected \"!=\", \"%\", \"&\", \"*\", \"+\", \"-\", \"--\", \".\", \"/\", \"<\", \"<<\", \"<=\", \"<>\", \"=\", \">\", \">=\", \">>\", \">>>\", \"?\", \"??\", \"AND\", \"BETWEEN\", \"IN\", \"OR\", \"ORDER\", \"[\", \"^\", \"|\", \"||\", [ \\t\\n\\r], or end of input but \"O\" found.",
"expected": [], // omitted for brevity
"found": "O",
"location": {
"start": {
"offset": 61,
"line": 4,
"column": 1
},
"end": {
"offset": 62,
"line": 4,
"column": 2
}
},
"name": "SyntaxError"
}
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.