Skip to content

Commit 12ceec3

Browse files
committed
GRAPH_TABLE syntax w/ dummy MATCH
1 parent e0a6101 commit 12ceec3

File tree

2 files changed

+365
-310
lines changed

2 files changed

+365
-310
lines changed

partiql-parser/src/lexer/partiql.rs

Lines changed: 150 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,6 @@ pub enum Token<'input> {
262262
EmbeddedDoc(&'input str),
263263

264264
// Keywords
265-
#[regex("(?i:Acyclic)")]
266-
Acyclic,
267265
#[regex("(?i:All)")]
268266
All,
269267
#[regex("(?i:Asc)")]
@@ -282,6 +280,8 @@ pub enum Token<'input> {
282280
By,
283281
#[regex("(?i:Case)")]
284282
Case,
283+
#[regex("(?i:Columns)")]
284+
Columns,
285285
#[regex("(?i:Cross)")]
286286
Cross,
287287
#[regex("(?i:Cycle)")]
@@ -302,6 +302,8 @@ pub enum Token<'input> {
302302
Except,
303303
#[regex("(?i:Exclude)")]
304304
Exclude,
305+
#[regex("(?i:Export)")]
306+
Export,
305307
#[regex("(?i:False)")]
306308
False,
307309
#[regex("(?i:First)")]
@@ -342,6 +344,8 @@ pub enum Token<'input> {
342344
Missing,
343345
#[regex("(?i:Natural)")]
344346
Natural,
347+
#[regex("(?i:No)")]
348+
No,
345349
#[regex("(?i:Not)")]
346350
Not,
347351
#[regex("(?i:Null)")]
@@ -352,6 +356,8 @@ pub enum Token<'input> {
352356
Offset,
353357
#[regex("(?i:On)")]
354358
On,
359+
#[regex("(?i:One)")]
360+
One,
355361
#[regex("(?i:Or)")]
356362
Or,
357363
#[regex("(?i:Order)")]
@@ -360,14 +366,18 @@ pub enum Token<'input> {
360366
Outer,
361367
#[regex("(?i:Partial)")]
362368
Partial,
369+
#[regex("(?i:Per)")]
370+
Per,
363371
#[regex("(?i:Pivot)")]
364372
Pivot,
365373
#[regex("(?i:Preserve)")]
366374
Preserve,
367-
#[regex("(?i:Right)")]
368-
Right,
369375
#[regex("(?i:Recursive)")]
370376
Recursive,
377+
#[regex("(?i:Right)")]
378+
Right,
379+
#[regex("(?i:Row)")]
380+
Row,
371381
#[regex("(?i:Select)")]
372382
Select,
373383
#[regex("(?i:Search)")]
@@ -380,12 +390,8 @@ pub enum Token<'input> {
380390
Timestamp,
381391
#[regex("(?i:Simple)")]
382392
Simple,
383-
#[regex("(?i:Shortest)")]
384-
Shortest,
385393
#[regex("(?i:Then)")]
386394
Then,
387-
#[regex("(?i:Trail)")]
388-
Trail,
389395
#[regex("(?i:True)")]
390396
True,
391397
#[regex("(?i:Union)")]
@@ -408,21 +414,151 @@ pub enum Token<'input> {
408414
Without,
409415
#[regex("(?i:Zone)")]
410416
Zone,
417+
418+
// Graph Keywords; reserved
419+
#[regex("(?i:ALL_DIFFERENT)")]
420+
AllDifferent,
421+
#[regex("(?i:BINDING_COUNT)")]
422+
BindingCount,
423+
#[regex("(?i:ELEMENT_ID)")]
424+
ElementId,
425+
#[regex("(?i:ELEMENT_NUMBER)")]
426+
ElementNumber,
427+
#[regex("(?i:GRAPH)")]
428+
Graph,
429+
#[regex("(?i:GRAPH_TABLE)")]
430+
GraphTable,
431+
#[regex("(?i:MATCHNUM)")]
432+
MatchNum,
433+
#[regex("(?i:PATH_LENGTH)")]
434+
PathLength,
435+
#[regex("(?i:PATH_NAME)")]
436+
PathName,
437+
#[regex("(?i:PROPERTY_EXISTS)")]
438+
PropertyExists,
439+
#[regex("(?i:SAME)")]
440+
Same,
441+
442+
// Graph Keywords; non-reserved
443+
#[regex("(?i:ACYCLIC)")]
444+
Acyclic,
445+
#[regex("(?i:BINDINGS)")]
446+
Bindings,
447+
#[regex("(?i:BOUND)")]
448+
Bound,
449+
#[regex("(?i:DESTINATION)")]
450+
Destination,
451+
#[regex("(?i:DIFFERENT)")]
452+
Different,
453+
#[regex("(?i:DIRECTED)")]
454+
Directed,
455+
#[regex("(?i:EDGE)")]
456+
Edge,
457+
#[regex("(?i:EDGES)")]
458+
Edges,
459+
#[regex("(?i:ELEMENTS)")]
460+
Elements,
461+
#[regex("(?i:LABEL)")]
462+
Label,
463+
#[regex("(?i:LABELED)")]
464+
Labeled,
465+
#[regex("(?i:NODE)")]
466+
Node,
467+
#[regex("(?i:PATHS)")]
468+
Paths,
469+
#[regex("(?i:PROPERTIES)")]
470+
Properties,
471+
#[regex("(?i:PROPERTY)")]
472+
Property,
473+
#[regex("(?i:PROPERTY_GRAPH_CATALOG)")]
474+
PropertyGraphCatalog,
475+
#[regex("(?i:PROPERTY_GRAPH_NAME)")]
476+
PropertyGraphName,
477+
#[regex("(?i:PROPERTY_GRAPH_SCHEMA)")]
478+
PropertyGraphSchema,
479+
#[regex("(?i:RELATIONSHIP)")]
480+
Relationship,
481+
#[regex("(?i:RELATIONSHIPS)")]
482+
Relationships,
483+
#[regex("(?i:SHORTEST)")]
484+
Shortest,
485+
#[regex("(?i:SINGLETONS)")]
486+
Singletons,
487+
#[regex("(?i:STEP)")]
488+
Step,
489+
#[regex("(?i:TABLES)")]
490+
Tables,
491+
#[regex("(?i:TRAIL)")]
492+
Trail,
493+
#[regex("(?i:VERTEX)")]
494+
Vertex,
495+
#[regex("(?i:WALK)")]
496+
Walk,
411497
}
412498

413499
impl Token<'_> {
500+
#[inline]
414501
pub fn is_var_non_reserved(&self) -> bool {
502+
matches!(self, Token::Any | Token::Simple) || self.is_graph_non_reserved()
503+
}
504+
505+
#[inline]
506+
pub fn is_fn_non_reserved(&self) -> bool {
507+
matches!(self, Token::Any | Token::Simple) || self.is_graph_non_reserved()
508+
}
509+
510+
#[inline]
511+
pub fn is_graph_reserved(&self) -> bool {
415512
matches!(
416513
self,
417-
Token::Acyclic | Token::Any | Token::Simple | Token::Shortest | Token::Trail
514+
Token::AllDifferent
515+
| Token::BindingCount
516+
| Token::ElementId
517+
| Token::ElementNumber
518+
| Token::Graph
519+
| Token::GraphTable
520+
| Token::MatchNum
521+
| Token::PathLength
522+
| Token::PathName
523+
| Token::PropertyExists
524+
| Token::Same
418525
)
419526
}
420-
pub fn is_fn_non_reserved(&self) -> bool {
527+
528+
#[inline]
529+
pub fn is_graph_non_reserved(&self) -> bool {
421530
matches!(
422531
self,
423-
Token::Acyclic | Token::Any | Token::Simple | Token::Shortest | Token::Trail
532+
Token::Acyclic
533+
| Token::Bindings
534+
| Token::Bound
535+
| Token::Destination
536+
| Token::Different
537+
| Token::Directed
538+
| Token::Edge
539+
| Token::Edges
540+
| Token::Elements
541+
| Token::Label
542+
| Token::Labeled
543+
| Token::Node
544+
| Token::Paths
545+
| Token::Properties
546+
| Token::Property
547+
| Token::PropertyGraphCatalog
548+
| Token::PropertyGraphName
549+
| Token::PropertyGraphSchema
550+
| Token::Relationship
551+
| Token::Relationships
552+
| Token::Shortest
553+
| Token::Singletons
554+
| Token::Step
555+
| Token::Tables
556+
| Token::Trail
557+
| Token::Vertex
558+
| Token::Walk
424559
)
425560
}
561+
426562
pub fn is_keyword(&self) -> bool {
427563
matches!(
428564
self,
@@ -491,7 +627,8 @@ impl Token<'_> {
491627
| Token::Values
492628
| Token::Where
493629
| Token::With
494-
)
630+
) || self.is_graph_reserved()
631+
|| self.is_graph_non_reserved()
495632
}
496633
}
497634

@@ -543,79 +680,7 @@ impl fmt::Display for Token<'_> {
543680
Token::EmbeddedDoc(txt) => write!(f, "<```{txt}```:DOC>"),
544681
Token::EmptyEmbeddedDocQuote => write!(f, "<``:DOC>"),
545682

546-
Token::Acyclic
547-
| Token::All
548-
| Token::Asc
549-
| Token::And
550-
| Token::Any
551-
| Token::As
552-
| Token::At
553-
| Token::Between
554-
| Token::By
555-
| Token::Case
556-
| Token::Cross
557-
| Token::Cycle
558-
| Token::Date
559-
| Token::Desc
560-
| Token::Distinct
561-
| Token::Else
562-
| Token::End
563-
| Token::Escape
564-
| Token::Except
565-
| Token::Exclude
566-
| Token::False
567-
| Token::First
568-
| Token::For
569-
| Token::Full
570-
| Token::From
571-
| Token::Group
572-
| Token::Having
573-
| Token::In
574-
| Token::Inner
575-
| Token::Is
576-
| Token::Intersect
577-
| Token::Join
578-
| Token::Last
579-
| Token::Lateral
580-
| Token::Left
581-
| Token::Like
582-
| Token::Limit
583-
| Token::Match
584-
| Token::Missing
585-
| Token::Natural
586-
| Token::Not
587-
| Token::Null
588-
| Token::Nulls
589-
| Token::Offset
590-
| Token::On
591-
| Token::Or
592-
| Token::Order
593-
| Token::Outer
594-
| Token::Partial
595-
| Token::Pivot
596-
| Token::Preserve
597-
| Token::Right
598-
| Token::Recursive
599-
| Token::Search
600-
| Token::Select
601-
| Token::Table
602-
| Token::Time
603-
| Token::Timestamp
604-
| Token::Simple
605-
| Token::Shortest
606-
| Token::Then
607-
| Token::Trail
608-
| Token::True
609-
| Token::Union
610-
| Token::Unpivot
611-
| Token::Using
612-
| Token::Value
613-
| Token::Values
614-
| Token::When
615-
| Token::Where
616-
| Token::With
617-
| Token::Without
618-
| Token::Zone => {
683+
_ => {
619684
write!(f, "{}", format!("{self:?}").to_uppercase())
620685
}
621686
}

0 commit comments

Comments
 (0)