nodenamo-query-parser
v1.3.0
Published
A query parser for nodenamo
Downloads
2
Readme
nodenamo-query-parser
Nodenamo Query Language Parser
Usage
Example
import {parse} from 'nodenamo-query-parser'
let statement = parse('FIND * FROM users WHERE department = "IT" FILTER enabled = true ORDER ASC LIMIT 10')
console.log(statement)
Output
{
type: 'find',
projections: undefined,
from: 'users',
using: undefined,
where: {
expressionAttributeNames: { '#department': 'department' },
expressionAttributeValues: { ':department': 'IT' },
keyConditions: '#department = :department'
},
filter: {
expressionAttributeNames: { '#enabled': 'enabled' },
expressionAttributeValues: { ':enabled': true },
filterExpression: '#enabled = :enabled'
},
resume: undefined,
order: true,
limit: 10,
stronglyConsistent: undefined
}
Nodenamo Query Language
Table of Content
IMPORT statement
Syntax
IMPORT class FROM "path" IMPORT class AS alias FROM "path" IMPORT {class} FROM "path" IMPORT {class as alias} FROM "path"
where:
class
is the exported class decorated with nodenamo's@DBTable
alias
is an alias to be referenced to the imported class from subsequent statements.path
is the path to the file or a package containing theclass
to import.
Example
IMPORT usersTable as users FROM "./usersTable.ts"
Output
{
type: 'import',
entity: [ { name: 'usersTable', as: 'users', default: true } ],
from: './usersTable.ts'
}
INSERT Statement
Syntax
INSERT jsonObject INTO table WHERE expression
Example
INSERT {id:2,title:"some thing",price:21,status:true} INTO books WHERE attribute_not_exists(id)
Output
{
type: 'insert',
object: { id: 2, title: 'some thing', price: 21, status: true },
into: 'books',
where: {
expressionAttributeNames: { '#id': 'id' },
expressionAttributeValues: {},
conditionExpression: 'attribute_not_exists(#id)'
}
}
GET Statement
Syntax
GET id FROM table STRONGLY CONSISTENT
Example
GET 42 FROM users STRONGLY CONSISTENT
Output
{
type: 'get',
id: 42,
from: 'users',
stronglyConsistent: true
}
LIST Statement
Syntax
LIST projections FROM table USING indexName BY hashRange FILTER filterExpressions RESUME "lastEvaluatedKey" ORDER order LIMIT number STRONGLY CONSISTENT
where:
projections
is a list of properties to return. Use*
to return all properties.indexName
is the name of a GSI.hashRange
is a value to search against a hash property. It can be optionally followed by a comma and a value to search against a range property.order
isASC
orDESC
strongly consistent
can be used to request a consistent read.
Example
LIST * FROM users BY "name" , "timestamp" FILTER email = "[email protected]" ORDER asc LIMIT 10 STRONGLY CONSISTENT
Output
{
type: 'list',
projections: undefined,
from: 'users',
using: undefined,
by: { hash: 'name', range: 'timestamp' },
filter: {
expressionAttributeNames: { '#email': 'email' },
expressionAttributeValues: { ':email': '[email protected]' },
filterExpression: '#email = :email'
},
resume: undefined,
order: true,
limit: 10,
stronglyConsistent: true
}
FIND Statement
Syntax
FIND projections FROM table USING indexName WHERE keyConditions FILTER filterExpressions RESUME "lastEvaluatedKey" ORDER order LIMIT number STRONGLY CONSISTENT
where:
projections
is a list of properties to return. Use*
to return all properties.indexName
is the name of a GSI.order
isASC
orDESC
strongly consistent
can be used to request a consistent read.
Example
FIND id, name, email FROM users USING users-gsi WHERE name = "some one" FILTER email = "[email protected]" resume "token" ORDER desc LIMIT 2 STRONGLY CONSISTENT
Output
{
type: 'find',
projections: [ 'id', 'name', 'email' ],
from: 'users',
using: 'users-gsi',
where: {
expressionAttributeNames: { '#name': 'name' },
expressionAttributeValues: { ':name': 'some one' },
keyConditions: '#name = :name'
},
filter: {
expressionAttributeNames: { '#email': 'email' },
expressionAttributeValues: { ':email': '[email protected]' },
filterExpression: '#email = :email'
},
resume: 'token',
order: false,
limit: 2,
stronglyConsistent: true
}
UPDATE Statement
Syntax
UPDATE jsonObject FROM table WHERE conditionExpression RETURNING returnValue WITH VERSION CHECK
where:
WITH VERSION CHECK
can be used to request a version check.returnValue
isNONE
,ALLNEW
, orALLOLD
Example
UPDATE {id:1,name:"new name"} FROM users WHERE attribute_not_exists(id) RETURNING ALLOLD WITH VERSION CHECK
Output
{
type: 'update',
object: { id: 1, name: 'new name' },
from: 'users',
where: {
expressionAttributeNames: { '#id': 'id' },
expressionAttributeValues: {},
conditionExpression: 'attribute_not_exists(#id)'
},
versionCheck: true,
returning: AllNew
}
ON Statement
Syntax
ON id FROM table SETsetExpression ADD addExpression DELETE deleteExpression REMOVE removeExpression conditionExpression RETURNING returnValue WITH VERSION CHECK
where:
WITH VERSION CHECK
can be used to request a version check.returnValue
isNONE
,ALLNEW
, orALLOLD
Example
ON 42 FROM users SET lastViewed = "today" ADD count 1 WHERE published = true WITH VERSION CHECK
Output
{
type: 'on',
id: 42,
from: 'users',
set: {
setExpressions: [ '#lastViewed___1 = :lastViewed___1' ],
expressionAttributeNames: { '#lastViewed___1': 'lastViewed' },
expressionAttributeValues: { ':lastViewed___1': 'today' }
},
add: {
addExpressions: [ '#count___2 :count___2' ],
expressionAttributeNames: { '#count___2': 'count' },
expressionAttributeValues: { ':count___2': 1 }
},
remove: undefined,
delete: undefined,
where: {
expressionAttributeNames: { '#published': 'published' },
expressionAttributeValues: { ':published': true },
conditionExpression: '#published = :published'
},
versionCheck: true
}
DELETE Statement
Syntax
DELETE id FROM table WHERE conditionExpression
Example
DELETE 42 FROM books WHERE deleted <> true
Output
{
type: 'delete',
id: 42,
from: 'books',
where: {
expression: '#deleted <> :deleted',
expressionAttributeNames: { '#deleted': 'deleted' },
expressionAttributeValues: { ':deleted': true }
}
}
UNLOAD TABLE Statement
Syntax
UNLOAD TABLE name
where:
name
is the imported class name or its alias.
Example
UNLOAD TABLE users
Output
{
type: 'unload_table',
name: 'users'
}
CREATE TABLE Statement
Syntax
CREATE TABLE FOR name WITH CAPACITY OF readCapacityNumber, writeCapacityNumber
where:
name
is the imported class name or its alias.readCapacityNumber
is the desired read capacity for the table.writeCapacityNumber
is the desired write capacity for the table.
Example
CREATE TABLE FOR users WITH CAPACITY OF 123, 456
Output
{
type: 'create_table',
for: 'users',
withCapacityOf: { readCapacity: 123, writeCapacity: 456 }
}
DELETE TABLE Statement
Syntax
DELETE TABLE FOR name
where:
name
is the imported class name or its alias.
Example
DELETE TABLE FOR users
Output
{
type: 'delete_table',
for: 'users'
}
SHOW TABLES Statement
Syntax
SHOW TABLES
Example
SHOW TABLES
Output
{
type: 'show_tables',
}
EXPLAIN Statement
Syntax
Explain statement
where:
statement
is one of nodenamo query language stattements.
Example
EXPLAIN INSERT {id:1,name:"some one"} INTO users
Output
{
type: 'explain',
statement: {
type: 'insert',
object: { id: 1, name: 'some one' },
into: 'users',
where: undefined
}
}
DESCRIBE Statement
Syntax
Describe name
where:
name
is the imported class name or its alias.
Example
DESCRIBE users
Output
{
type: 'describe',
name: 'users'
}