Skip to content

Commit bdd3eb7

Browse files
authored
Merge pull request #3 from delphi-hub/develop
Syntax changes for field selections
2 parents 83f2653 + 23e4816 commit bdd3eb7

File tree

4 files changed

+101
-27
lines changed

4 files changed

+101
-27
lines changed

build.sbt

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ ThisBuild / publishTo := {
2929
}
3030
ThisBuild / publishMavenStyle := true
3131

32-
ThisBuild / version := "0.9.1"
32+
ThisBuild / version := "0.9.2"
3333

3434
lazy val scala212 = "2.12.10"
3535
lazy val scala213 = "2.13.1"

core/src/main/scala/de/upb/cs/swt/delphi/core/ql/AST.scala

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package de.upb.cs.swt.delphi.core.ql
1818

19+
case class Query(expr : CombinatorialExpr, selections : Seq[FieldReference] = Seq())
20+
1921
trait CombinatorialExpr
2022

2123
case class AndExpr(left: CombinatorialExpr, right: CombinatorialExpr) extends CombinatorialExpr

core/src/main/scala/de/upb/cs/swt/delphi/core/ql/Syntax.scala

+9-3
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@ import org.parboiled2.{CharPredicate, Parser, ParserInput, Rule1}
2222
* The syntax definition and parser for the Delphi QL.
2323
*
2424
* @author Lisa Nguyen Quang Do
25-
* @author Ben Hermann
25+
* @author Ben Hermann~
2626
*
2727
*/
2828
class Syntax(val input : ParserInput) extends Parser {
2929

3030
def QueryRule = rule {
31-
CombinatorialRule ~ EOI
31+
CombinatorialRule ~ zeroOrMore(Whitespace ~ FieldSelection) ~ Whitespace ~ EOI ~> Query
3232
}
3333

34+
3435
// Combinatorial rules.
3536
def CombinatorialRule : Rule1[CombinatorialExpr] = rule {
3637
OrOrElseRule | NotRule
@@ -67,7 +68,8 @@ class Syntax(val input : ParserInput) extends Parser {
6768
def IsTrue = rule { FieldReferenceRule ~> IsTrueExpr }
6869

6970
// Literals
70-
def FieldReferenceRule = rule { "[" ~ capture(oneOrMore(CharPredicate.AlphaNum ++ '.' ++ '-' ++ ' ' ++ '_' ++ '(' ++ ':' ++')')) ~ "]" ~> FieldReference }
71+
def FieldReferenceRule = rule { "[" ~ capture(oneOrMore(FieldAlphabet)) ~ "]" ~> FieldReference }
72+
def FieldAlphabet = CharPredicate.AlphaNum ++ '.' ++ '-' ++ ' ' ++ '_' ++ '(' ++ ':' ++')'
7173

7274
def IntegerLiteral = rule { capture(oneOrMore(CharPredicate.Digit)) }
7375
def StringLiteral = rule { '"' ~ capture(oneOrMore(CharPredicate.Printable -- '"' )) ~ '"'}
@@ -81,6 +83,10 @@ class Syntax(val input : ParserInput) extends Parser {
8183
def OneOrMoreWhitespace = rule {
8284
oneOrMore(anyOf(" \n \r"))
8385
}
86+
87+
// Field selection
88+
def FieldSelection = rule { '#' ~ "[" ~ capture(oneOrMore(ExtendedFieldAlphabet)) ~ "]" ~> FieldReference}
89+
def ExtendedFieldAlphabet = FieldAlphabet ++ '*'
8490
}
8591

8692

core/src/test/scala/de/upb/cs/swt/delphi/core/SyntaxTest.scala

+89-23
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import scala.util.{Failure, Success}
2626
* Tests for the DelphiQL syntax.
2727
*
2828
* @author Lisa Nguyen Quang Do
29+
* @author Ben Hermann
2930
*/
3031
class SyntaxTest extends FlatSpec with Matchers {
3132

@@ -34,7 +35,7 @@ class SyntaxTest extends FlatSpec with Matchers {
3435
parseResult shouldBe a [Success[_]]
3536
parseResult match {
3637
case Success(ast) => {
37-
ast.toString shouldEqual "EqualExpr(FieldReference(Filter1),abc)"
38+
ast shouldEqual Query(EqualExpr(FieldReference("Filter1"),"abc"))
3839
}
3940
}
4041
}
@@ -45,7 +46,7 @@ class SyntaxTest extends FlatSpec with Matchers {
4546
parseResult shouldBe a [Success[_]]
4647
parseResult match {
4748
case Success(ast) => {
48-
ast.toString shouldEqual "IsTrueExpr(FieldReference(Filter1))"
49+
ast shouldEqual Query(IsTrueExpr(FieldReference("Filter1")))
4950
}
5051
}
5152
}
@@ -67,7 +68,11 @@ class SyntaxTest extends FlatSpec with Matchers {
6768
parseResult shouldBe a [Success[_]]
6869
parseResult match {
6970
case Success(ast) => {
70-
ast.toString shouldEqual "AndExpr(IsTrueExpr(FieldReference(Filter1)),EqualExpr(FieldReference(Filter2),3))"
71+
ast shouldEqual
72+
Query(
73+
AndExpr(
74+
IsTrueExpr(FieldReference("Filter1")),
75+
EqualExpr(FieldReference("Filter2"),"3")))
7176
}
7277
}
7378
}
@@ -78,8 +83,13 @@ class SyntaxTest extends FlatSpec with Matchers {
7883
parseResult shouldBe a [Success[_]]
7984
parseResult match {
8085
case Success(ast) => {
81-
ast.toString shouldEqual "OrExpr(IsTrueExpr(FieldReference(Filter1)),AndExpr(IsTrueExpr(FieldReference(Filter2))," +
82-
"OrExpr(LessThanExpr(FieldReference(Filter3),3),GreaterThanExpr(FieldReference(Filter4),0))))"
86+
ast shouldEqual
87+
Query(
88+
OrExpr(
89+
IsTrueExpr(FieldReference("Filter1")),
90+
AndExpr(IsTrueExpr(FieldReference("Filter2")),
91+
OrExpr(LessThanExpr(FieldReference("Filter3"),"3"),
92+
GreaterThanExpr(FieldReference("Filter4"),"0")))))
8393
}
8494
}
8595
}
@@ -90,8 +100,14 @@ class SyntaxTest extends FlatSpec with Matchers {
90100
parseResult shouldBe a [Success[_]]
91101
parseResult match {
92102
case Success(ast) => {
93-
ast.toString shouldEqual "AndExpr(IsTrueExpr(FieldReference(Filter1)),XorExpr(OrExpr(LessThanExpr(FieldReference(Filter2),3)," +
94-
"GreaterThanExpr(FieldReference(Filter2),0)),AndExpr(IsTrueExpr(FieldReference(Filter4)),IsTrueExpr(FieldReference(Filter5)))))"
103+
ast shouldEqual
104+
Query(
105+
AndExpr(
106+
IsTrueExpr(FieldReference("Filter1")),
107+
XorExpr(OrExpr(LessThanExpr(FieldReference("Filter2"),"3"),
108+
GreaterThanExpr(FieldReference("Filter2"),"0")),
109+
AndExpr(IsTrueExpr(FieldReference("Filter4")),
110+
IsTrueExpr(FieldReference("Filter5"))))))
95111
}
96112
}
97113
}
@@ -112,8 +128,13 @@ class SyntaxTest extends FlatSpec with Matchers {
112128
parseResult shouldBe a [Success[_]]
113129
parseResult match {
114130
case Success(ast) => {
115-
ast.toString shouldEqual "AndExpr(AndExpr(IsTrueExpr(FieldReference(Filter1))," +
116-
"IsTrueExpr(FieldReference(Filter2))),IsTrueExpr(FieldReference(Filter3)))"
131+
ast shouldEqual
132+
Query(
133+
AndExpr(
134+
AndExpr(
135+
IsTrueExpr(FieldReference("Filter1")),
136+
IsTrueExpr(FieldReference("Filter2"))),
137+
IsTrueExpr(FieldReference("Filter3"))))
117138
}
118139
}
119140
}
@@ -123,8 +144,15 @@ class SyntaxTest extends FlatSpec with Matchers {
123144
parseResult shouldBe a [Success[_]]
124145
parseResult match {
125146
case Success(ast) => {
126-
ast.toString shouldEqual "OrExpr(IsTrueExpr(FieldReference(Filter1)),AndExpr(XorExpr(" +
127-
"IsTrueExpr(FieldReference(Filter2)),NotExpr(IsTrueExpr(FieldReference(Filter3)))),IsTrueExpr(FieldReference(Filter4))))"
147+
ast shouldEqual
148+
Query(
149+
OrExpr(
150+
IsTrueExpr(FieldReference("Filter1")),
151+
AndExpr(
152+
XorExpr(
153+
IsTrueExpr(FieldReference("Filter2")),
154+
NotExpr(IsTrueExpr(FieldReference("Filter3")))),
155+
IsTrueExpr(FieldReference("Filter4")))))
128156
}
129157
}
130158
}
@@ -135,9 +163,16 @@ class SyntaxTest extends FlatSpec with Matchers {
135163
parseResult shouldBe a [Success[_]]
136164
parseResult match {
137165
case Success(ast) => {
138-
ast.toString shouldEqual "AndExpr(OrExpr(IsTrueExpr(FieldReference(Filter1)),IsTrueExpr(FieldReference(Filter2)))," +
139-
"XorExpr(NotExpr(IsTrueExpr(FieldReference(Filter3))),NotExpr(AndExpr(IsTrueExpr(FieldReference(Filter4))," +
140-
"IsTrueExpr(FieldReference(Filter5))))))"
166+
ast shouldEqual
167+
Query(
168+
AndExpr(
169+
OrExpr(
170+
IsTrueExpr(FieldReference("Filter1")),
171+
IsTrueExpr(FieldReference("Filter2"))),
172+
XorExpr(
173+
NotExpr(IsTrueExpr(FieldReference("Filter3"))),
174+
NotExpr(AndExpr(IsTrueExpr(FieldReference("Filter4")),
175+
IsTrueExpr(FieldReference("Filter5")))))))
141176
}
142177
}
143178
}
@@ -148,8 +183,11 @@ class SyntaxTest extends FlatSpec with Matchers {
148183
parseResult shouldBe a [Success[_]]
149184
parseResult match {
150185
case Success(ast) => {
151-
ast.toString shouldEqual "AndExpr(NotExpr(IsTrueExpr(FieldReference(Filter1)))," +
152-
"NotExpr(IsTrueExpr(FieldReference(Filter2))))"
186+
ast shouldEqual
187+
Query(
188+
AndExpr(
189+
NotExpr(IsTrueExpr(FieldReference("Filter1"))),
190+
NotExpr(IsTrueExpr(FieldReference("Filter2")))))
153191
}
154192
}
155193
}
@@ -159,8 +197,12 @@ class SyntaxTest extends FlatSpec with Matchers {
159197
parseResult shouldBe a [Success[_]]
160198
parseResult match {
161199
case Success(ast) => {
162-
ast.toString shouldEqual "NotExpr(AndExpr(IsTrueExpr(FieldReference(Filter1))," +
163-
"NotExpr(IsTrueExpr(FieldReference(Filter2)))))"
200+
ast shouldEqual
201+
Query(
202+
NotExpr(
203+
AndExpr(
204+
IsTrueExpr(FieldReference("Filter1")),
205+
NotExpr(IsTrueExpr(FieldReference("Filter2"))))))
164206
}
165207
}
166208
}
@@ -170,9 +212,16 @@ class SyntaxTest extends FlatSpec with Matchers {
170212
parseResult shouldBe a[Success[_]]
171213
parseResult match {
172214
case Success(ast) => {
173-
ast.toString shouldEqual "AndExpr(NotExpr(NotExpr(IsTrueExpr(FieldReference(Filter1))))," +
174-
"NotExpr(OrExpr(LessOrEqualExpr(FieldReference(Filter2),0),NotExpr(AndExpr(IsTrueExpr(FieldReference(Filter3))," +
175-
"NotExpr(LikeExpr(FieldReference(Filter4),abc)))))))"
215+
ast shouldEqual
216+
Query(
217+
AndExpr(
218+
NotExpr(
219+
NotExpr(IsTrueExpr(FieldReference("Filter1")))),
220+
NotExpr(
221+
OrExpr(
222+
LessOrEqualExpr(FieldReference("Filter2"),"0"),
223+
NotExpr(AndExpr(IsTrueExpr(FieldReference("Filter3")),
224+
NotExpr(LikeExpr(FieldReference("Filter4"),"abc"))))))))
176225
}
177226
}
178227
}
@@ -183,11 +232,28 @@ class SyntaxTest extends FlatSpec with Matchers {
183232
parseResult match {
184233
case Success(ast) => {
185234
ast shouldEqual
186-
AndExpr(
235+
Query(AndExpr(
187236
AndExpr(
188237
GreaterThanExpr(FieldReference("metrics.classversion.9"),"0"),
189238
EqualExpr(FieldReference("metrics.classversion.8"),"0")),
190-
EqualExpr(FieldReference("maven.groupId"),"com.github.xmlet"))
239+
EqualExpr(FieldReference("maven.groupId"),"com.github.xmlet")))
240+
}
241+
case Failure(exception : ParseError) => {
242+
fail(parser.formatError(exception))
243+
}
244+
case _ => fail()
245+
}
246+
}
247+
248+
"Single field selection" should "be valid" in {
249+
val parser = new Syntax("[metrics.api.unsafe.heapget]>0 #[metrics.bytecode.*]")
250+
val parseResult = parser.QueryRule.run()
251+
parseResult match {
252+
case Success(ast) => {
253+
ast shouldEqual
254+
Query(
255+
GreaterThanExpr(FieldReference("metrics.api.unsafe.heapget"),"0"),
256+
Seq(FieldReference("metrics.bytecode.*")))
191257
}
192258
case Failure(exception : ParseError) => {
193259
fail(parser.formatError(exception))

0 commit comments

Comments
 (0)