2016-02-26 17:27:07 +00:00
|
|
|
// Copyright © 2016 Abcum Ltd
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package sql
|
|
|
|
|
|
|
|
// --------------------------------------------------
|
|
|
|
// Queries
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// Query represents a multi statement SQL query
|
|
|
|
type Query struct {
|
|
|
|
Statements Statements
|
|
|
|
}
|
|
|
|
|
|
|
|
// Statement represents a single SQL AST
|
|
|
|
type Statement interface{}
|
|
|
|
|
|
|
|
// Statements represents multiple SQL ASTs
|
|
|
|
type Statements []Statement
|
|
|
|
|
|
|
|
// --------------------------------------------------
|
2016-09-06 13:30:59 +00:00
|
|
|
// Use
|
2016-02-26 17:27:07 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// UseStatement represents a SQL USE statement.
|
|
|
|
type UseStatement struct {
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
}
|
|
|
|
|
|
|
|
// --------------------------------------------------
|
2016-09-06 13:30:59 +00:00
|
|
|
// Trans
|
2016-05-23 12:32:02 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
|
2016-09-06 13:30:59 +00:00
|
|
|
type BeginStatement struct{}
|
|
|
|
|
|
|
|
type CancelStatement struct{}
|
|
|
|
|
|
|
|
type CommitStatement struct{}
|
|
|
|
|
|
|
|
// --------------------------------------------------
|
|
|
|
// Normal
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// ActionStatement represents a SQL ACTION statement.
|
|
|
|
type ActionStatement struct {
|
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
Expr []*Field // Which fields
|
|
|
|
What []Expr // What to select
|
|
|
|
Cond []Expr // Select conditions
|
|
|
|
Group []*Group // Group by
|
|
|
|
Order []*Order // Order by
|
|
|
|
Limit Expr // Limit by
|
|
|
|
Start Expr // Start at
|
|
|
|
Version Expr // Version
|
|
|
|
}
|
|
|
|
|
2016-02-26 17:27:07 +00:00
|
|
|
// SelectStatement represents a SQL SELECT statement.
|
|
|
|
type SelectStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
Expr []*Field // Which fields
|
|
|
|
What []Expr // What to select
|
|
|
|
Cond []Expr // Select conditions
|
|
|
|
Group []*Group // Group by
|
|
|
|
Order []*Order // Order by
|
|
|
|
Limit Expr // Limit by
|
|
|
|
Start Expr // Start at
|
|
|
|
Version Expr // Version
|
2016-09-06 13:30:59 +00:00
|
|
|
Echo Token // What to return
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// CreateStatement represents a SQL CREATE statement.
|
2016-05-23 12:32:02 +00:00
|
|
|
//
|
|
|
|
// CREATE person SET column = 'value' RETURN ID
|
2016-02-26 17:27:07 +00:00
|
|
|
type CreateStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
What []Expr // What to create
|
|
|
|
Data []Expr // Create data
|
|
|
|
Echo Token // What to return
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateStatement represents a SQL UPDATE statement.
|
2016-05-23 12:32:02 +00:00
|
|
|
//
|
|
|
|
// UPDATE person SET column = 'value' WHERE age < 18 RETURN ID
|
2016-02-26 17:27:07 +00:00
|
|
|
type UpdateStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
What []Expr // What to update
|
|
|
|
Data []Expr // Update data
|
|
|
|
Cond []Expr // Update conditions
|
|
|
|
Echo Token // What to return
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-02-27 09:44:49 +00:00
|
|
|
// ModifyStatement represents a SQL UPDATE statement.
|
2016-05-23 12:32:02 +00:00
|
|
|
//
|
|
|
|
// MODIFY @person:123 WITH {} RETURN ID
|
2016-02-27 09:44:49 +00:00
|
|
|
type ModifyStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
What []Expr // What to modify
|
2016-07-04 10:37:37 +00:00
|
|
|
Diff []Expr // Diff object
|
|
|
|
Cond []Expr // Update conditions
|
2016-05-23 12:32:02 +00:00
|
|
|
Echo Token // What to return
|
2016-02-27 09:44:49 +00:00
|
|
|
}
|
|
|
|
|
2016-02-26 17:27:07 +00:00
|
|
|
// DeleteStatement represents a SQL DELETE statement.
|
2016-05-23 12:32:02 +00:00
|
|
|
//
|
|
|
|
// DELETE FROM person WHERE age < 18 RETURN ID
|
2016-02-26 17:27:07 +00:00
|
|
|
type DeleteStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
2016-07-04 10:37:37 +00:00
|
|
|
Hard bool // Expunge
|
2016-05-23 12:32:02 +00:00
|
|
|
What []Expr // What to delete
|
|
|
|
Cond []Expr // Delete conditions
|
|
|
|
Echo Token // What to return
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// RelateStatement represents a SQL RELATE statement.
|
2016-05-23 12:32:02 +00:00
|
|
|
//
|
|
|
|
// RELATE friend FROM @person:123 TO @person:456 SET column = 'value' RETURN ID
|
2016-02-26 17:27:07 +00:00
|
|
|
type RelateStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
Type []Expr
|
|
|
|
From []Expr
|
|
|
|
To []Expr
|
|
|
|
Data []Expr
|
|
|
|
Echo Token // What to return
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// RecordStatement represents a SQL CREATE EVENT statement.
|
2016-05-23 12:32:02 +00:00
|
|
|
//
|
2016-02-26 17:27:07 +00:00
|
|
|
// RECORD login ON @person:123 AT 2016-01-29T22:42:56.478Z SET column = true
|
|
|
|
type RecordStatement struct {
|
2016-05-23 12:32:02 +00:00
|
|
|
EX bool // Explain
|
|
|
|
KV string // Bucket
|
|
|
|
NS string // Namespace
|
|
|
|
DB string // Database
|
|
|
|
Type []Expr
|
|
|
|
On []Expr
|
2016-02-26 17:27:07 +00:00
|
|
|
At Expr
|
2016-05-23 12:32:02 +00:00
|
|
|
Data []Expr
|
|
|
|
Echo Token // What to return
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-07-21 21:50:16 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
// Rules
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// DefineRulesStatement represents an SQL DEFINE RULES statement.
|
|
|
|
//
|
|
|
|
// DEFINE RULES person
|
|
|
|
type DefineRulesStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
|
|
|
When []string `json:"-" msgpack:"-"` // Action names
|
|
|
|
Rule string `json:"rule" msgpack:"rule"` // Rule behaviour
|
|
|
|
Code string `json:"code" msgpack:"code"` // Rule custom code
|
2016-07-21 21:50:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// RemoveRulesStatement represents an SQL REMOVE RULES statement.
|
|
|
|
//
|
|
|
|
// REMOVE RULES person
|
|
|
|
type RemoveRulesStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
|
|
|
When []string `json:"-" msgpack:"-"` // Action names
|
2016-07-21 21:50:16 +00:00
|
|
|
}
|
|
|
|
|
2016-02-26 17:27:07 +00:00
|
|
|
// --------------------------------------------------
|
2016-05-23 12:32:02 +00:00
|
|
|
// Table
|
2016-02-26 17:27:07 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// DefineTableStatement represents an SQL DEFINE TABLE statement.
|
|
|
|
//
|
|
|
|
// DEFINE TABLE person
|
|
|
|
type DefineTableStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// RemoveTableStatement represents an SQL REMOVE TABLE statement.
|
|
|
|
//
|
|
|
|
// REMOVE TABLE person
|
|
|
|
type RemoveTableStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
// Field
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// DefineFieldStatement represents an SQL DEFINE INDEX statement.
|
|
|
|
//
|
|
|
|
// DEFINE FIELD name ON person TYPE string CODE {}
|
2016-07-21 21:48:32 +00:00
|
|
|
// DEFINE FIELD name ON person TYPE number MIN 0 MAX 5 DEFAULT 0
|
|
|
|
// DEFINE FIELD name ON person TYPE custom ENUM [0,1,2,3,4,5] DEFAULT 0
|
2016-05-23 12:32:02 +00:00
|
|
|
type DefineFieldStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
Name string `json:"name" msgpack:"name"` // Field name
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
|
|
|
Type string `json:"type" msgpack:"type"` // Field type
|
|
|
|
Enum []interface{} `json:"enum" msgpack:"enum"` // Custom options
|
|
|
|
Code string `json:"code" msgpack:"code"` // Field code
|
|
|
|
Min float64 `json:"min" msgpack:"min"` // Minimum value / length
|
|
|
|
Max float64 `json:"max" msgpack:"max"` // Maximum value / length
|
|
|
|
Match string `json:"match" msgpack:"match"` // Regex value
|
|
|
|
Default interface{} `json:"default" msgpack:"default"` // Default value
|
|
|
|
Notnull bool `json:"notnull" msgpack:"notnull"` // Notnull - can not be NULL?
|
|
|
|
Readonly bool `json:"readonly" msgpack:"readonly"` // Readonly - can not be changed?
|
|
|
|
Mandatory bool `json:"mandatory" msgpack:"mandatory"` // Mandatory - can not be VOID?
|
|
|
|
Validate bool `json:"validate" msgpack:"validate"` // Validate - can not be INCORRECT?
|
2016-05-23 12:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// RemoveFieldStatement represents an SQL REMOVE INDEX statement.
|
|
|
|
//
|
|
|
|
// REMOVE FIELD name ON person
|
|
|
|
type RemoveFieldStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
Name string `json:"-" msgpack:"-"` // Field name
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// --------------------------------------------------
|
2016-05-23 12:32:02 +00:00
|
|
|
// Index
|
2016-02-26 17:27:07 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// DefineIndexStatement represents an SQL DEFINE INDEX statement.
|
|
|
|
//
|
|
|
|
// DEFINE INDEX name ON person COLUMNS (account, age) UNIQUE
|
|
|
|
type DefineIndexStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
Name string `json:"name" msgpack:"name"` // Index name
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
|
|
|
Cols []string `json:"cols" msgpack:"cols"` // Index cols
|
|
|
|
Uniq bool `json:"unique" msgpack:"unique"` // Unique index
|
|
|
|
CI bool
|
|
|
|
CS bool
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// RemoveIndexStatement represents an SQL REMOVE INDEX statement.
|
|
|
|
//
|
|
|
|
// REMOVE INDEX name ON person
|
|
|
|
type RemoveIndexStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
Name string `json:"-" msgpack:"-"` // Index name
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// ResyncIndexStatement represents an SQL RESYNC INDEX statement.
|
|
|
|
//
|
|
|
|
// RESYNC INDEX name ON person
|
|
|
|
type ResyncIndexStatement struct {
|
2016-09-06 13:30:59 +00:00
|
|
|
EX bool `json:"-" msgpack:"-"` // Explain
|
|
|
|
KV string `json:"-" msgpack:"-"` // Bucket
|
|
|
|
NS string `json:"-" msgpack:"-"` // Namespace
|
|
|
|
DB string `json:"-" msgpack:"-"` // Database
|
|
|
|
What []string `json:"-" msgpack:"-"` // Table names
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// --------------------------------------------------
|
|
|
|
// Literals
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// Expr represents a sql expression
|
|
|
|
type Expr interface{}
|
|
|
|
|
2016-07-04 10:37:37 +00:00
|
|
|
// All represents a wildcard expression.
|
|
|
|
type All struct{}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// Asc represents the ASC expression.
|
|
|
|
type Asc struct{}
|
|
|
|
|
|
|
|
// Desc represents the DESC expression.
|
|
|
|
type Desc struct{}
|
|
|
|
|
2016-02-26 17:27:07 +00:00
|
|
|
// Null represents a null expression.
|
|
|
|
type Null struct{}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// Void represents an expression which is not set.
|
|
|
|
type Void struct{}
|
|
|
|
|
|
|
|
// Empty represents an expression which is null or "".
|
|
|
|
type Empty struct{}
|
|
|
|
|
2016-02-26 17:27:07 +00:00
|
|
|
// ClosedExpression represents a parenthesized expression.
|
|
|
|
type ClosedExpression struct {
|
|
|
|
Expr Expr
|
|
|
|
}
|
|
|
|
|
|
|
|
// BinaryExpression represents a binary expression tree,
|
|
|
|
type BinaryExpression struct {
|
|
|
|
LHS Expr
|
2016-09-06 13:30:59 +00:00
|
|
|
Op Token
|
2016-02-26 17:27:07 +00:00
|
|
|
RHS Expr
|
|
|
|
}
|
|
|
|
|
2016-05-23 12:32:02 +00:00
|
|
|
// DiffExpression represents a JSON DIFF PATCH
|
|
|
|
type DiffExpression struct {
|
2016-07-04 10:37:37 +00:00
|
|
|
JSON interface{}
|
2016-05-23 12:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// MergeExpression represents JSON to MERGE
|
|
|
|
type MergeExpression struct {
|
2016-07-04 10:37:37 +00:00
|
|
|
JSON interface{}
|
2016-05-23 12:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ContentExpression represents JSON to REPLACE
|
|
|
|
type ContentExpression struct {
|
2016-07-04 10:37:37 +00:00
|
|
|
JSON interface{}
|
2016-05-23 12:32:02 +00:00
|
|
|
}
|
|
|
|
|
2016-02-26 17:27:07 +00:00
|
|
|
// --------------------------------------------------
|
|
|
|
// Parts
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
2016-09-06 13:30:59 +00:00
|
|
|
// Ident comment
|
|
|
|
type Ident struct {
|
|
|
|
ID string
|
2016-07-04 10:37:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-06 13:30:59 +00:00
|
|
|
// Table comment
|
|
|
|
type Table struct {
|
|
|
|
TB string
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Thing comment
|
|
|
|
type Thing struct {
|
2016-05-24 12:51:52 +00:00
|
|
|
TB string
|
|
|
|
ID interface{}
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Field comment
|
|
|
|
type Field struct {
|
|
|
|
Expr Expr
|
2016-09-06 13:30:59 +00:00
|
|
|
Alias string
|
2016-02-26 17:27:07 +00:00
|
|
|
}
|
|
|
|
|
2016-09-06 13:30:59 +00:00
|
|
|
// Group represents an sql GROUP BY clause
|
2016-02-26 17:27:07 +00:00
|
|
|
type Group struct {
|
|
|
|
Expr Expr
|
|
|
|
}
|
|
|
|
|
2016-09-06 13:30:59 +00:00
|
|
|
// Order represents an sql ORDER BY clause
|
2016-02-26 17:27:07 +00:00
|
|
|
type Order struct {
|
|
|
|
Expr Expr
|
|
|
|
Dir Expr
|
|
|
|
}
|