Skip to content

Commit 40393a3

Browse files
committed
added query executor and ast visitors
1 parent 5b6969e commit 40393a3

24 files changed

+432
-89
lines changed

src/Query/IQueryAstVisitor.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Unitinium
2+
{
3+
public interface IQueryAstVisitor
4+
{
5+
object Visit(QueryAstBase node, object currentData);
6+
}
7+
}

src/Query/QueryGrammar.cs.meta renamed to src/Query/IQueryAstVisitor.cs.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Query/IQueryLexer.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Unitinium
2+
{
3+
public interface IQueryLexer
4+
{
5+
object[] Tokenize(string query);
6+
}
7+
}

src/Query/QuerySyntaxTreeNode.cs.meta renamed to src/Query/IQueryLexer.cs.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Query/IQueryParser.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Unitinium
2+
{
3+
public interface IQueryParser
4+
{
5+
QueryAstBase[] Parse(object[] tokens);
6+
}
7+
}

src/Query/IQueryParser.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Query/QueryAstBase.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
namespace Unitinium
2+
{
3+
public abstract class QueryAstBase
4+
{
5+
public object Value { get; set; }
6+
7+
public override string ToString()
8+
{
9+
return $"{Value}({GetType().Name})";
10+
}
11+
12+
public override bool Equals(object obj)
13+
{
14+
if (obj?.GetType() == GetType())
15+
{
16+
var casted = (QueryAstBase) obj;
17+
if (casted.Value == null && Value == null)
18+
{
19+
return true;
20+
}
21+
22+
var idEquals = casted.Value?.Equals(Value);
23+
return idEquals.HasValue ? idEquals.Value : false;
24+
}
25+
return base.Equals(obj);
26+
}
27+
}
28+
29+
public class QueryNameAst : QueryAstBase
30+
{
31+
}
32+
33+
public class QueryGlobalAst : QueryAstBase
34+
{
35+
}
36+
37+
public class QueryComponentAst : QueryAstBase
38+
{
39+
}
40+
41+
public class QueryFirstExpandAst : QueryAstBase
42+
{
43+
}
44+
45+
public class QueryIndexAst : QueryAstBase
46+
{
47+
}
48+
}

src/Query/QueryAstBase.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Query/QueryLexer.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
namespace Unitinium
55
{
6-
public class QueryLexer
6+
public class QueryLexer : IQueryLexer
77
{
8-
public object[] Parse(string query)
8+
public object[] Tokenize(string query)
99
{
1010
if (string.IsNullOrEmpty(query))
1111
{
@@ -84,5 +84,15 @@ public QuerySpecialToken(string value)
8484
{
8585
Value = value;
8686
}
87+
88+
public override bool Equals(object obj)
89+
{
90+
if (obj is QuerySpecialToken token && token.Value.Equals(Value))
91+
{
92+
return true;
93+
}
94+
95+
return base.Equals(obj);
96+
}
8797
}
8898
}

src/Query/QueryGrammar.cs renamed to src/Query/QueryParser.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
using System;
21
using System.Collections.Generic;
32

43
namespace Unitinium
54
{
6-
public class QueryGrammar
5+
public class QueryParser : IQueryParser
76
{
8-
public QuerySyntaxTreeNode[] CreateSystaxTree(object[] tokens)
7+
public QueryAstBase[] Parse(object[] tokens)
98
{
109
var tokenQueue = new Queue<object>(tokens);
11-
var nodeList = new List<QuerySyntaxTreeNode>();
10+
var nodeList = new List<QueryAstBase>();
1211

1312
while (tokenQueue.Count > 0)
1413
{
@@ -32,7 +31,7 @@ public QuerySyntaxTreeNode[] CreateSystaxTree(object[] tokens)
3231

3332
if (name != null)
3433
{
35-
nodeList.Add(new QueryNameSyntaxTreeNode
34+
nodeList.Add(new QueryNameAst
3635
{
3736
Value = name
3837
});
@@ -45,7 +44,7 @@ public QuerySyntaxTreeNode[] CreateSystaxTree(object[] tokens)
4544
return nodeList.ToArray();
4645
}
4746

48-
private QuerySyntaxTreeNode ProcessOperator(QuerySpecialToken token, Queue<object> tokenQueue)
47+
private QueryAstBase ProcessOperator(QuerySpecialToken token, Queue<object> tokenQueue)
4948
{
5049
if (token.Value == "$")
5150
{
@@ -59,7 +58,7 @@ private QuerySyntaxTreeNode ProcessOperator(QuerySpecialToken token, Queue<objec
5958

6059
if (token.Value == ".")
6160
{
62-
return new QueryFirstExpandSyntaxTreeNode();
61+
return new QueryFirstExpandAst();
6362
}
6463

6564
if (token.Value == "[")
@@ -70,13 +69,13 @@ private QuerySyntaxTreeNode ProcessOperator(QuerySpecialToken token, Queue<objec
7069
throw new QueryGrammarException($"Not expected operator {token.Value}");
7170
}
7271

73-
private QuerySyntaxTreeNode ProcessIndex(Queue<object> tokenQueue)
72+
private QueryAstBase ProcessIndex(Queue<object> tokenQueue)
7473
{
7574
var intValue = Dequeue(tokenQueue, "number");
7675
var end = Dequeue(tokenQueue, "]");
7776
if (intValue is int && end is QuerySpecialToken endValue && endValue.Value == "]")
7877
{
79-
return new QueryIndexSyntaxTreeNode
78+
return new QueryIndexAst
8079
{
8180
Value = intValue
8281
};
@@ -86,12 +85,12 @@ private QuerySyntaxTreeNode ProcessIndex(Queue<object> tokenQueue)
8685
}
8786

8887

89-
private QuerySyntaxTreeNode ProcessComponentFilter(Queue<object> tokenQueue)
88+
private QueryAstBase ProcessComponentFilter(Queue<object> tokenQueue)
9089
{
9190
var name = Dequeue(tokenQueue, "identifier");
9291
if (name is string value)
9392
{
94-
return new QueryComponentSyntaxTreeNode()
93+
return new QueryComponentAst()
9594
{
9695
Value = value
9796
};
@@ -100,12 +99,12 @@ private QuerySyntaxTreeNode ProcessComponentFilter(Queue<object> tokenQueue)
10099
throw new QueryGrammarException($"Expected identifier after # operator");
101100
}
102101

103-
private QuerySyntaxTreeNode ProcessGlobaFilter(Queue<object> tokenQueue)
102+
private QueryAstBase ProcessGlobaFilter(Queue<object> tokenQueue)
104103
{
105104
var name = tokenQueue.Dequeue();
106105
if (name is string | name is int)
107106
{
108-
return new QueryGlobalSyntaxTreeNode
107+
return new QueryGlobalAst
109108
{
110109
Value = name
111110
};

0 commit comments

Comments
 (0)