diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index fa7907dd..4b1f8121 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -885,7 +885,7 @@ pub enum SyntaxKind { IS_JSON_OBJECT, IS_JSON_SCALAR, IS_JSON_VALUE, - IS_LABEL_EXPRESSION, + IS_LABEL, IS_NORMALIZED, IS_NOT, IS_NOT_DISTINCT_FROM, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index e52b15d5..51ac663c 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -4092,6 +4092,7 @@ pub(crate) fn current_operator(p: &Parser<'_>) -> Option { } fn using_index(p: &mut Parser<'_>) { + assert!(p.at(USING_KW)); let m = p.start(); p.bump(USING_KW); p.expect(INDEX_KW); @@ -8516,12 +8517,15 @@ fn opt_key_columns(p: &mut Parser<'_>) { } fn opt_element_table_label_and_properties(p: &mut Parser<'_>) { - if !opt_element_table_properties_clause(p) && p.at(DEFAULT_KW) || p.at(LABEL_KW) { - label_and_properties_list(p); + if !opt_element_table_properties_clause(p) { + opt_label_and_properties_list(p); } } -fn label_and_properties_list(p: &mut Parser<'_>) { +fn opt_label_and_properties_list(p: &mut Parser<'_>) { + if !p.at(DEFAULT_KW) && !p.at(LABEL_KW) { + return; + } let m = p.start(); label_and_properties(p); while p.at(DEFAULT_KW) || p.at(LABEL_KW) { @@ -8687,6 +8691,7 @@ fn alter_vertex_edge_table(p: &mut Parser<'_>) { } fn drop_edge_tables(p: &mut Parser<'_>) { + assert!(p.at(DROP_KW)); let m = p.start(); p.bump(DROP_KW); p.bump_any(); // EDGE/RELATIONSHIP @@ -8871,20 +8876,20 @@ fn vertex_pattern(p: &mut Parser<'_>) { let m = p.start(); p.expect(L_PAREN); opt_name(p); - opt_is_label_expression(p); + opt_is_label(p); opt_where_clause(p); p.expect(R_PAREN); m.complete(p, VERTEX_PATTERN); } -fn opt_is_label_expression(p: &mut Parser<'_>) { +fn opt_is_label(p: &mut Parser<'_>) { if p.at(IS_KW) { let m = p.start(); p.bump(IS_KW); if expr(p).is_none() { p.error("expected expression"); } - m.complete(p, IS_LABEL_EXPRESSION); + m.complete(p, IS_LABEL); } } @@ -8920,7 +8925,7 @@ fn edge_with_bracket(p: &mut Parser<'_>) { fn opt_edge_pattern_inner(p: &mut Parser<'_>) { opt_name(p); - opt_is_label_expression(p); + opt_is_label(p); opt_where_clause(p); } diff --git a/crates/squawk_parser/tests/data/ok/sql_pgq.sql b/crates/squawk_parser/tests/data/ok/sql_pgq.sql new file mode 100644 index 00000000..78c9fa52 --- /dev/null +++ b/crates/squawk_parser/tests/data/ok/sql_pgq.sql @@ -0,0 +1,157 @@ +-- squawk-ignore-file prefer-bigint-over-int, prefer-robust-stmts +set statement_timeout = '5s'; +set lock_timeout = '1s'; + +-- +-- via Postgres' docs +-- 5.15. Property Graphs +-- +CREATE TABLE products ( + product_no integer PRIMARY KEY, + name varchar, + price numeric +); + +CREATE TABLE customers ( + customer_id integer PRIMARY KEY, + name varchar, + address varchar +); + +CREATE TABLE orders ( + order_id integer PRIMARY KEY, + ordered_when date +); + +CREATE TABLE order_items ( + order_items_id integer PRIMARY KEY, + order_id integer REFERENCES orders (order_id), + product_no integer REFERENCES products (product_no), + quantity integer +); + +CREATE TABLE customer_orders ( + customer_orders_id integer PRIMARY KEY, + customer_id integer REFERENCES customers (customer_id), + order_id integer REFERENCES orders (order_id) +); + +CREATE PROPERTY GRAPH myshop + VERTEX TABLES ( + products, + customers, + orders + ) + EDGE TABLES ( + order_items SOURCE orders DESTINATION products, + customer_orders SOURCE customers DESTINATION orders + ); + +-- get list of customers active today +SELECT customer_name FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders WHERE o.ordered_when = current_date) COLUMNS (c.name AS customer_name)); + +-- get list of customers active today +SELECT customers.name FROM customers JOIN customer_orders USING (customer_id) JOIN orders USING (order_id) WHERE orders.ordered_when = current_date; + +-- explicit version that doesn't require primary & foreign keys +CREATE PROPERTY GRAPH myshop + VERTEX TABLES ( + products KEY (product_no), + customers KEY (customer_id), + orders KEY (order_id) + ) + EDGE TABLES ( + order_items KEY (order_items_id) + SOURCE KEY (order_id) REFERENCES orders (order_id) + DESTINATION KEY (product_no) REFERENCES products (product_no), + customer_orders KEY (customer_orders_id) + SOURCE KEY (customer_id) REFERENCES customers (customer_id) + DESTINATION KEY (order_id) REFERENCES orders (order_id) + ); + +CREATE PROPERTY GRAPH myshop + VERTEX TABLES ( + products LABEL product, + customers LABEL customer, + orders LABEL "order" + ) + EDGE TABLES ( + order_items SOURCE orders DESTINATION products LABEL contains, + customer_orders SOURCE customers DESTINATION orders LABEL has_placed + ); + +SELECT customer_name FROM GRAPH_TABLE (myshop MATCH (c IS customer)-[IS has_placed]->(o IS "order" WHERE o.ordered_when = current_date) COLUMNS (c.name AS customer_name)); + + +select * from +GRAPH_TABLE (mygraph MATCH (p IS person)-[h IS has]->(a IS account) + COLUMNS (p.name AS person_name, h.since AS has_account_since, a.num AS account_number)); + +-- +-- via: https://pgql-lang.org +-- +create table Persons( + id bigint primary key, + name text, + company_id bigint references Companies +); + +create table Companies( + id bigint primary key, + name text +); + +create table Accounts( + number bigint primary key, + account_type text, + person_id bigint references Persons, + company_id bigint references Companies +); + +create table Transactions( + id bigint primary key, + from_account bigint references Accounts, + to_account bigint references Accounts, + date timestamptz, + amount bigint +); + +CREATE PROPERTY GRAPH financial_transactions + VERTEX TABLES ( + -- label that gets used in the query lang below, i.e., IS Person + Persons LABEL Person PROPERTIES ( name ), + Companies LABEL Company PROPERTIES ( name ), + Accounts LABEL Account PROPERTIES ( number ) + ) + EDGE TABLES ( + Transactions + SOURCE KEY ( from_account ) REFERENCES Accounts ( number ) + DESTINATION KEY ( to_account ) REFERENCES Accounts ( number ) + LABEL transaction + PROPERTIES ( amount ), + Accounts AS PersonOwner + SOURCE KEY ( number ) REFERENCES Accounts ( number ) + DESTINATION Persons + LABEL owner + NO PROPERTIES, + Accounts AS CompanyOwner + SOURCE KEY ( number ) REFERENCES Accounts ( number ) + DESTINATION Companies + LABEL owner + NO PROPERTIES, + Persons AS worksFor + SOURCE KEY ( id ) REFERENCES Persons ( id ) + DESTINATION Companies + NO PROPERTIES + ); + +SELECT account_holder, SUM(amount) AS total_transacted_with_Nikita +FROM GRAPH_TABLE ( + financial_transactions + MATCH (p IS Person) <-[IS owner]- (account1 IS Account), + (account1) -[t IS transaction]- (account2), /* match both incoming and outgoing transactions */ + (account2 IS Account) -[IS owner]-> (owner IS Person|Company) + WHERE p.name = 'Nikita' + COLUMNS (owner.name AS account_holder, t.amount) +) +GROUP BY account_holder diff --git a/crates/squawk_parser/tests/snapshots/tests__select_graph_table_fn_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_graph_table_fn_ok.snap index 8d813008..75d0a4af 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_graph_table_fn_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_graph_table_fn_ok.snap @@ -83,7 +83,7 @@ SOURCE_FILE NAME IDENT "foo" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -217,7 +217,7 @@ SOURCE_FILE NAME IDENT "foo" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -352,7 +352,7 @@ SOURCE_FILE NAME IDENT "foo" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -469,7 +469,7 @@ SOURCE_FILE NAME IDENT "o" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -539,7 +539,7 @@ SOURCE_FILE NAME IDENT "o" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -802,7 +802,7 @@ SOURCE_FILE NAME IDENT "foo" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -866,7 +866,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -879,7 +879,7 @@ SOURCE_FILE NAME IDENT "co" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -893,7 +893,7 @@ SOURCE_FILE NAME IDENT "o" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -981,7 +981,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1011,7 +1011,7 @@ SOURCE_FILE NAME IDENT "e1" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1026,7 +1026,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1063,7 +1063,7 @@ SOURCE_FILE NAME IDENT "e2" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1077,7 +1077,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1108,7 +1108,7 @@ SOURCE_FILE NAME IDENT "e3" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1122,7 +1122,7 @@ SOURCE_FILE NAME IDENT "d" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1203,7 +1203,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1213,7 +1213,7 @@ SOURCE_FILE EDGE_RIGHT MINUS "-" L_BRACK "[" - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1227,7 +1227,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1242,7 +1242,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1252,7 +1252,7 @@ SOURCE_FILE EDGE_RIGHT MINUS "-" L_BRACK "[" - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1266,7 +1266,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1281,7 +1281,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1291,7 +1291,7 @@ SOURCE_FILE EDGE_RIGHT MINUS "-" L_BRACK "[" - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1305,7 +1305,7 @@ SOURCE_FILE NAME IDENT "w" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1386,7 +1386,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1424,7 +1424,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1461,7 +1461,7 @@ SOURCE_FILE NAME IDENT "e" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1476,7 +1476,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1573,7 +1573,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1598,7 +1598,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1609,7 +1609,7 @@ SOURCE_FILE EDGE_ANY MINUS "-" L_BRACK "[" - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1623,7 +1623,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1639,7 +1639,7 @@ SOURCE_FILE L_ANGLE "<" MINUS "-" L_BRACK "[" - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1652,7 +1652,7 @@ SOURCE_FILE NAME IDENT "d" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1671,7 +1671,7 @@ SOURCE_FILE NAME IDENT "e" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1781,7 +1781,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1795,7 +1795,7 @@ SOURCE_FILE NAME IDENT "e1" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1814,7 +1814,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1828,7 +1828,7 @@ SOURCE_FILE NAME IDENT "e2" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1843,7 +1843,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1949,7 +1949,7 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1967,7 +1967,7 @@ SOURCE_FILE NAME IDENT "b" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -1985,7 +1985,7 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -2002,7 +2002,7 @@ SOURCE_FILE NAME IDENT "d" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -2016,7 +2016,7 @@ SOURCE_FILE NAME IDENT "e" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -2031,7 +2031,7 @@ SOURCE_FILE NAME IDENT "f" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -2046,7 +2046,7 @@ SOURCE_FILE NAME IDENT "g" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF @@ -2060,7 +2060,7 @@ SOURCE_FILE NAME IDENT "h" WHITESPACE " " - IS_LABEL_EXPRESSION + IS_LABEL IS_KW "is" WHITESPACE " " NAME_REF diff --git a/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap b/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap new file mode 100644 index 00000000..50284e0c --- /dev/null +++ b/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap @@ -0,0 +1,2010 @@ +--- +source: crates/squawk_parser/tests/tests.rs +input_file: crates/squawk_parser/tests/data/ok/sql_pgq.sql +--- +SOURCE_FILE + COMMENT "-- squawk-ignore-file prefer-bigint-over-int, prefer-robust-stmts" + WHITESPACE "\n" + SET + SET_KW "set" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "statement_timeout" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'5s'" + SEMICOLON ";" + WHITESPACE "\n" + SET + SET_KW "set" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "lock_timeout" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'1s'" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "--" + WHITESPACE "\n" + COMMENT "-- via Postgres' docs" + WHITESPACE "\n" + COMMENT "-- 5.15. Property Graphs" + WHITESPACE "\n" + COMMENT "--" + WHITESPACE "\n" + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "products" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "product_no" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + NAME_KW "name" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "price" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + NUMERIC_KW "numeric" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "customers" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "customer_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + NAME_KW "name" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "address" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "orders" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "order_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "ordered_when" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "date" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "order_items" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "order_items_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "order_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "REFERENCES" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "orders" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "order_id" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "product_no" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "REFERENCES" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "products" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "product_no" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "quantity" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "customer_orders" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "customer_orders_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "customer_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "REFERENCES" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "customers" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "customer_id" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "order_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INTEGER_KW "integer" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "REFERENCES" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "orders" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "order_id" + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_PROPERTY_GRAPH + CREATE_KW "CREATE" + WHITESPACE " " + PROPERTY_KW "PROPERTY" + WHITESPACE " " + GRAPH_KW "GRAPH" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "myshop" + WHITESPACE "\n " + VERTEX_TABLES + VERTEX_KW "VERTEX" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "products" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "customers" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "orders" + WHITESPACE "\n " + R_PAREN ")" + WHITESPACE "\n " + EDGE_TABLES + EDGE_KW "EDGE" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "order_items" + WHITESPACE " " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + NAME + IDENT "orders" + WHITESPACE " " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "products" + COMMA "," + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "customer_orders" + WHITESPACE " " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + NAME + IDENT "customers" + WHITESPACE " " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "orders" + WHITESPACE "\n " + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- get list of customers active today" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "customer_name" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM + GRAPH_TABLE_FN + GRAPH_TABLE_KW "GRAPH_TABLE" + WHITESPACE " " + L_PAREN "(" + PATH + PATH_SEGMENT + NAME_REF + IDENT "myshop" + WHITESPACE " " + MATCH_KW "MATCH" + WHITESPACE " " + PATH_PATTERN_LIST + PATH_PATTERN + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "c" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "customers" + R_PAREN ")" + PATH_FACTOR + EDGE_RIGHT + MINUS "-" + L_BRACK "[" + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "customer_orders" + R_BRACK "]" + MINUS "-" + R_ANGLE ">" + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "o" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "orders" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "WHERE" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "o" + DOT "." + NAME_REF + IDENT "ordered_when" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + CURRENT_DATE_KW "current_date" + R_PAREN ")" + WHITESPACE " " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + EXPR_AS_NAME_LIST + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + IDENT "c" + DOT "." + NAME_REF + NAME_KW "name" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "customer_name" + R_PAREN ")" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- get list of customers active today" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + IDENT "customers" + DOT "." + NAME_REF + NAME_KW "name" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + JOIN_EXPR + JOIN_EXPR + FROM_ITEM + NAME_REF + IDENT "customers" + WHITESPACE " " + JOIN + JOIN_INNER + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "customer_orders" + WHITESPACE " " + JOIN_USING_CLAUSE + USING_KW "USING" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "customer_id" + R_PAREN ")" + WHITESPACE " " + JOIN + JOIN_INNER + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "orders" + WHITESPACE " " + JOIN_USING_CLAUSE + USING_KW "USING" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "order_id" + R_PAREN ")" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "WHERE" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "orders" + DOT "." + NAME_REF + IDENT "ordered_when" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + CURRENT_DATE_KW "current_date" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- explicit version that doesn't require primary & foreign keys" + WHITESPACE "\n" + CREATE_PROPERTY_GRAPH + CREATE_KW "CREATE" + WHITESPACE " " + PROPERTY_KW "PROPERTY" + WHITESPACE " " + GRAPH_KW "GRAPH" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "myshop" + WHITESPACE "\n " + VERTEX_TABLES + VERTEX_KW "VERTEX" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "products" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "product_no" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "customers" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "customer_id" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "orders" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "order_id" + R_PAREN ")" + WHITESPACE "\n " + R_PAREN ")" + WHITESPACE "\n " + EDGE_TABLES + EDGE_KW "EDGE" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "order_items" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "order_items_id" + R_PAREN ")" + WHITESPACE "\n " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "order_id" + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "orders" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "order_id" + R_PAREN ")" + WHITESPACE "\n " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "product_no" + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "products" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "product_no" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "customer_orders" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "customer_orders_id" + R_PAREN ")" + WHITESPACE "\n " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "customer_id" + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "customers" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "customer_id" + R_PAREN ")" + WHITESPACE "\n " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "order_id" + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "orders" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "order_id" + R_PAREN ")" + WHITESPACE "\n " + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_PROPERTY_GRAPH + CREATE_KW "CREATE" + WHITESPACE " " + PROPERTY_KW "PROPERTY" + WHITESPACE " " + GRAPH_KW "GRAPH" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "myshop" + WHITESPACE "\n " + VERTEX_TABLES + VERTEX_KW "VERTEX" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "products" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "product" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "customers" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "customer" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "orders" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "\"order\"" + WHITESPACE "\n " + R_PAREN ")" + WHITESPACE "\n " + EDGE_TABLES + EDGE_KW "EDGE" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "order_items" + WHITESPACE " " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + NAME + IDENT "orders" + WHITESPACE " " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "products" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "contains" + COMMA "," + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "customer_orders" + WHITESPACE " " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + NAME + IDENT "customers" + WHITESPACE " " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "orders" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "has_placed" + WHITESPACE "\n " + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "customer_name" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM + GRAPH_TABLE_FN + GRAPH_TABLE_KW "GRAPH_TABLE" + WHITESPACE " " + L_PAREN "(" + PATH + PATH_SEGMENT + NAME_REF + IDENT "myshop" + WHITESPACE " " + MATCH_KW "MATCH" + WHITESPACE " " + PATH_PATTERN_LIST + PATH_PATTERN + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "c" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "customer" + R_PAREN ")" + PATH_FACTOR + EDGE_RIGHT + MINUS "-" + L_BRACK "[" + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "has_placed" + R_BRACK "]" + MINUS "-" + R_ANGLE ">" + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "o" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "\"order\"" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "WHERE" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "o" + DOT "." + NAME_REF + IDENT "ordered_when" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + CURRENT_DATE_KW "current_date" + R_PAREN ")" + WHITESPACE " " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + EXPR_AS_NAME_LIST + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + IDENT "c" + DOT "." + NAME_REF + NAME_KW "name" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "customer_name" + R_PAREN ")" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE "\n" + FROM_ITEM + GRAPH_TABLE_FN + GRAPH_TABLE_KW "GRAPH_TABLE" + WHITESPACE " " + L_PAREN "(" + PATH + PATH_SEGMENT + NAME_REF + IDENT "mygraph" + WHITESPACE " " + MATCH_KW "MATCH" + WHITESPACE " " + PATH_PATTERN_LIST + PATH_PATTERN + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "p" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "person" + R_PAREN ")" + PATH_FACTOR + EDGE_RIGHT + MINUS "-" + L_BRACK "[" + NAME + IDENT "h" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "has" + R_BRACK "]" + MINUS "-" + R_ANGLE ">" + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "a" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "account" + R_PAREN ")" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + EXPR_AS_NAME_LIST + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + IDENT "p" + DOT "." + NAME_REF + NAME_KW "name" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "person_name" + COMMA "," + WHITESPACE " " + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + IDENT "h" + DOT "." + NAME_REF + IDENT "since" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "has_account_since" + COMMA "," + WHITESPACE " " + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + IDENT "a" + DOT "." + NAME_REF + IDENT "num" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "account_number" + R_PAREN ")" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "--" + WHITESPACE "\n" + COMMENT "-- via: https://pgql-lang.org" + WHITESPACE "\n" + COMMENT "--" + WHITESPACE "\n" + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "Persons" + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "primary" + WHITESPACE " " + KEY_KW "key" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + NAME_KW "name" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "company_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "Companies" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "Companies" + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "primary" + WHITESPACE " " + KEY_KW "key" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + NAME_KW "name" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "Accounts" + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "primary" + WHITESPACE " " + KEY_KW "key" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "account_type" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "person_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "Persons" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "company_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "Companies" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "Transactions" + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "primary" + WHITESPACE " " + KEY_KW "key" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "from_account" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "Accounts" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "to_account" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "Accounts" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "date" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "timestamptz" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "amount" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_PROPERTY_GRAPH + CREATE_KW "CREATE" + WHITESPACE " " + PROPERTY_KW "PROPERTY" + WHITESPACE " " + GRAPH_KW "GRAPH" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "financial_transactions" + WHITESPACE "\n " + VERTEX_TABLES + VERTEX_KW "VERTEX" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + COMMENT "-- label that gets used in the query lang below, i.e., IS Person" + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Persons" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "Person" + WHITESPACE " " + PROPERTIES_LIST + PROPERTIES_KW "PROPERTIES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + EXPR_AS_NAME_LIST + EXPR_AS_NAME + NAME_REF + NAME_KW "name" + WHITESPACE " " + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Companies" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "Company" + WHITESPACE " " + PROPERTIES_LIST + PROPERTIES_KW "PROPERTIES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + EXPR_AS_NAME_LIST + EXPR_AS_NAME + NAME_REF + NAME_KW "name" + WHITESPACE " " + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + VERTEX_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Accounts" + WHITESPACE " " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + IDENT "Account" + WHITESPACE " " + PROPERTIES_LIST + PROPERTIES_KW "PROPERTIES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + EXPR_AS_NAME_LIST + EXPR_AS_NAME + NAME_REF + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n " + R_PAREN ")" + WHITESPACE "\n " + EDGE_TABLES + EDGE_KW "EDGE" + WHITESPACE " " + TABLES_KW "TABLES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Transactions" + WHITESPACE "\n " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "from_account" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "Accounts" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "to_account" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "Accounts" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + TRANSACTION_KW "transaction" + WHITESPACE "\n " + PROPERTIES_LIST + PROPERTIES_KW "PROPERTIES" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + EXPR_AS_NAME_LIST + EXPR_AS_NAME + NAME_REF + IDENT "amount" + WHITESPACE " " + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Accounts" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "PersonOwner" + WHITESPACE "\n " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "Accounts" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "Persons" + WHITESPACE "\n " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + OWNER_KW "owner" + WHITESPACE "\n " + NO_PROPERTIES + NO_KW "NO" + WHITESPACE " " + PROPERTIES_KW "PROPERTIES" + COMMA "," + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Accounts" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "CompanyOwner" + WHITESPACE "\n " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "Accounts" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "number" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "Companies" + WHITESPACE "\n " + LABEL_AND_PROPERTIES_LIST + LABEL_AND_PROPERTIES + LABEL_KW "LABEL" + WHITESPACE " " + NAME + OWNER_KW "owner" + WHITESPACE "\n " + NO_PROPERTIES + NO_KW "NO" + WHITESPACE " " + PROPERTIES_KW "PROPERTIES" + COMMA "," + WHITESPACE "\n " + EDGE_TABLE_DEF + PATH + PATH_SEGMENT + NAME_REF + IDENT "Persons" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "worksFor" + WHITESPACE "\n " + SOURCE_VERTEX_TABLE + SOURCE_KW "SOURCE" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + NAME_REF + IDENT "Persons" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n " + DEST_VERTEX_TABLE + DESTINATION_KW "DESTINATION" + WHITESPACE " " + NAME + IDENT "Companies" + WHITESPACE "\n " + NO_PROPERTIES + NO_KW "NO" + WHITESPACE " " + PROPERTIES_KW "PROPERTIES" + WHITESPACE "\n " + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "account_holder" + COMMA "," + WHITESPACE " " + TARGET + CALL_EXPR + NAME_REF + IDENT "SUM" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "amount" + R_PAREN ")" + WHITESPACE " " + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "total_transacted_with_Nikita" + WHITESPACE "\n" + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM + GRAPH_TABLE_FN + GRAPH_TABLE_KW "GRAPH_TABLE" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + PATH + PATH_SEGMENT + NAME_REF + IDENT "financial_transactions" + WHITESPACE "\n " + MATCH_KW "MATCH" + WHITESPACE " " + PATH_PATTERN_LIST + PATH_PATTERN + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "p" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "Person" + R_PAREN ")" + WHITESPACE " " + PATH_FACTOR + EDGE_LEFT + L_ANGLE "<" + MINUS "-" + L_BRACK "[" + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + OWNER_KW "owner" + R_BRACK "]" + MINUS "-" + WHITESPACE " " + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "account1" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "Account" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + PATH_PATTERN + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "account1" + R_PAREN ")" + WHITESPACE " " + PATH_FACTOR + EDGE_ANY + MINUS "-" + L_BRACK "[" + NAME + IDENT "t" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + TRANSACTION_KW "transaction" + R_BRACK "]" + MINUS "-" + WHITESPACE " " + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "account2" + R_PAREN ")" + COMMA "," + WHITESPACE " " + COMMENT "/* match both incoming and outgoing transactions */" + WHITESPACE "\n " + PATH_PATTERN + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + IDENT "account2" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + IDENT "Account" + R_PAREN ")" + WHITESPACE " " + PATH_FACTOR + EDGE_RIGHT + MINUS "-" + L_BRACK "[" + IS_LABEL + IS_KW "IS" + WHITESPACE " " + NAME_REF + OWNER_KW "owner" + R_BRACK "]" + MINUS "-" + R_ANGLE ">" + WHITESPACE " " + PATH_FACTOR + VERTEX_PATTERN + L_PAREN "(" + NAME + OWNER_KW "owner" + WHITESPACE " " + IS_LABEL + IS_KW "IS" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "Person" + CUSTOM_OP + PIPE "|" + NAME_REF + IDENT "Company" + R_PAREN ")" + WHITESPACE "\n " + WHERE_CLAUSE + WHERE_KW "WHERE" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "p" + DOT "." + NAME_REF + NAME_KW "name" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'Nikita'" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + EXPR_AS_NAME_LIST + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + OWNER_KW "owner" + DOT "." + NAME_REF + NAME_KW "name" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "account_holder" + COMMA "," + WHITESPACE " " + EXPR_AS_NAME + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "amount" + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + WHITESPACE "\n" + GROUP_BY_CLAUSE + GROUP_KW "GROUP" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + GROUP_BY_LIST + GROUPING_EXPR + NAME_REF + IDENT "account_holder" + WHITESPACE "\n" diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index dc262f92..d6c043b2 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -24724,7 +24724,7 @@ impl AstNode for IsJsonValue { impl AstNode for IsLabelExpression { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::IS_LABEL_EXPRESSION + kind == SyntaxKind::IS_LABEL } #[inline] fn cast(syntax: SyntaxNode) -> Option { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index f42d3c4c..794433e0 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -2390,24 +2390,24 @@ PathPrimary = | ParenGraphPattern VertexPattern = - '(' Name? IsLabelExpression? WhereClause? ')' + '(' Name? IsLabel? WhereClause? ')' EdgeLeft = - '<' '-' '[' Name? IsLabelExpression? WhereClause? ']' '-' + '<' '-' '[' Name? IsLabel? WhereClause? ']' '-' | '<' '-' EdgeRight = - '-' '[' Name? IsLabelExpression? WhereClause? ']' '-' '>' + '-' '[' Name? IsLabel? WhereClause? ']' '-' '>' | '-' '>' EdgeAny = - '-' '[' Name? IsLabelExpression? WhereClause? ']' '-' + '-' '[' Name? IsLabel? WhereClause? ']' '-' | '-' ParenGraphPattern = '(' PathPattern WhereClause? ')' -IsLabelExpression = +IsLabel = 'is' Expr GraphPatternQualifier =