surrealpatch/doc/QUERIES.md
Tobie Morgan Hitchcock e758a8e8fc Move docs/ to doc/
2016-08-10 10:52:56 +01:00

5.9 KiB

Queries

This document describes example SQL queries which can be used to query the database.

FIELD

/* Example of defining a custom field */
DEFINE FIELD age ON person TYPE number MIN 0 MAX 150 NOTNULL /* Define a numeric field */
DEFINE FIELD kind ON person TYPE custom ENUM ["private","public"] DEFAULT "private" /* ... or a predefined field */
DEFINE FIELD fullname ON person TYPE string CODE "return [doc.data.firstname, doc.data.middlename, doc.data.lastname].filter(function(i) { return i; }).join(' ');" /* ... or a custom-code field */
/* Remove the field definition */
REMOVE FIELD fullname ON person

INDEX

/* Example of defining a custom index */
DEFINE INDEX sortable ON person COLUMNS accounts, emails[0].value /* Define an index */
DEFINE INDEX sortable ON person COLUMNS accounts, emails[0].value UNIQUE /* ... or a unique index */
DEFINE INDEX sortable ON person CODE "if (doc.data.age && doc.data.age > 18) emit([doc.data.lastname, doc.data.firstname, doc.id]);" /* ... or a custom-code index */
/* Remove the index definition */
REMOVE INDEX sortable ON person

CREATE

/* Example of creating a table */
CREATE person /* Creates a new person */
CREATE person SET age=28, name='Tobie' /* ... and sets some fields */
CREATE person CONTENT {"firstname":"Tobie", "lastname":"Morgan Hitchcock"} /* ... and sets some fields */
/* Example of creating a specific record */
CREATE @person:id /* Creates a the person if they do not exist */
CREATE @person:id SET age = 28, name = 'Tobie' /* ... and sets name+age */
CREATE @person:id SET age = 28, name = 'Tobie', tags = [] /* ... and sets `tags` to an empty set */
CREATE @person:id SET age = 28, name = 'Tobie', tags = ['old'] /* ... and sets `tags` to a set with 1 element */
/* Example of multiple records in one statement */
CREATE @person:one, @person:two /* Creates both person records if they do not exist */

UPDATE

/* Example of updating a table */
UPDATE person /* Updates all person records */
UPDATE person SET age=VOID /* ... and removes the age field */
UPDATE person SET age=VOID WHERE age < 18 /* ... if the condition matches */
/* Example of updating a specific record */
UPDATE @person:id /* Ensures the person record exists */
UPDATE @person:id CONTENT {} /* ... and erases the record data */
UPDATE @person:id SET age = 28, name = 'Tobie' /* ... and sets name+age */
UPDATE @person:id SET age = 28, name = 'Tobie', tags = NULL /* ... and sets `tags` to NULL */
UPDATE @person:id SET age = 28, name = 'Tobie', tags = [] /* ... and sets `tags` to an empty set */
UPDATE @person:id SET age = 28, name = 'Tobie', tags = ['old'] /* ... and sets `tags` to a set with 1 element */
UPDATE @person:id SET age = 28, name = 'Tobie', tags += ['new'], tags -= ['old'] /* ... and adds 'new' to `tags` and removes 'old' from `tags */
/* Example of multiple records in one statement */
UPDATE @person:one, @person:two /* Ensures both person records exist */

DELETE

/* Example of deleting a table */
DELETE person /* Deletes all person records */
DELETE person WHERE age < 18 /* ... if the condition matches */
/* Example of deleting a specific record */
DELETE @person:id /* Deletes the person record */
DELETE @person:id WHERE age < 18 /* ... if the condition matches */
/* Example of multiple records in one statement */
DELETE @person:one, @person:two /* Deletes both person records */

MODIFY

/* Example of modifying a record with jsondiffpatch */
MODIFY @person:id DIFF {JSON}

RELATE

/* Example of defining graph edges between records */
RELATE friend FROM @person:one TO @person:two /* Define a graph edge */
RELATE friend FROM @person:one TO @person:two UNIQUE /* ... or ensure only one edge of this type exists */

SELECT

SELECT * FROM person
SELECT *, ->, <-, <-> FROM person

/* Examples of working with sets or arrays */

SELECT * FROM person WHERE tags  "tag" /* contains "tag" */
SELECT * FROM person WHERE "tag"  tags /* contains ""tag" */
SELECT * FROM person WHERE tags =~ "tag" /* contains "tag" */
SELECT * FROM person WHERE tags.? = "tag" /* ... any tag value is "tag" */
SELECT * FROM person WHERE tags CONTAINSSOME ["tag1", "tag2"] /* ... contains "tag1" or "tag2" */

SELECT * FROM person WHERE tags  "tag" /* does not contain "tag" */
SELECT * FROM person WHERE "tag"  tags /* does not contain "tag" */
SELECT * FROM person WHERE tags !~ "tag" /* does not contain "tag" */
SELECT * FROM person WHERE tags.* != "tag" /* ... no tag value is "tag" */
SELECT * FROM person WHERE tags CONTAINSNONE ["tag1", "tag2"] /* ... does not contain "tag1" and "tag2" */

/* Examples of working with objects and arrays of objects */

SELECT * FROM person WHERE emails.?.value = /gmail.com$/ /* ... any email address value ends with 'gmail.com' */
SELECT * FROM person WHERE emails.*.value = /gmail.com$/ /* ... every email address value ends with 'gmail.com' */

/* Examples of working with relationship paths */

SELECT ->[friend]->person FROM person

SELECT *, <->(friend|follow)-?
SELECT *, <-likes<-person.id
SELECT *, <-friend<-person[age>=18] AS friends
SELECT * FROM person WHERE ->friend->person->click->@email:1231

SELECT * FROM person WHERE age >= @person:tobie.age - 5

UPDATE person SET tags-="London";

SELECT *, ->friend->person(age>=18) AS acquaintances FROM person WHERE acquaintances IN [@person:test]
SELECT *, ->friend->person(age>=18) AS acquaintances FROM person WHERE acquaintances.firstname IN ['Tobie']

/* Examples of working with relationship paths and embedded objects */

SELECT * FROM person WHERE emails.*.value->to->email->to->@email:{tobie@abcum.com} /* Anybody who has sent an email to tobie@abcum.com */
SELECT * FROM person WHERE @email:{tobie@abcum.com}->from->email.id IN emails.?.value /* Anybody who has sent an email to tobie@abcum.com */