embulk-filter-row 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/CHANGELOG.md +6 -0
- data/README.md +124 -4
- data/build.gradle +15 -4
- data/classpath/embulk-filter-row-0.3.0.jar +0 -0
- data/example/and.yml +0 -7
- data/example/example.yml +0 -7
- data/example/where.yml +28 -0
- data/script/byaccj.sh +29 -0
- data/src/main/java/org/embulk/filter/row/{AbstractColumnVisitor.java → AbstractGuardColumnVisitor.java} +9 -17
- data/src/main/java/org/embulk/filter/row/BuildColumnVisitorImpl.java +98 -0
- data/src/main/java/org/embulk/filter/row/{ColumnVisitorAndImpl.java → GuardColumnVisitorAndImpl.java} +11 -45
- data/src/main/java/org/embulk/filter/row/{ColumnVisitorOrImpl.java → GuardColumnVisitorOrImpl.java} +11 -45
- data/src/main/java/org/embulk/filter/row/GuardColumnVisitorWhereImpl.java +28 -0
- data/src/main/java/org/embulk/filter/row/RowFilterPlugin.java +49 -16
- data/src/main/java/org/embulk/filter/row/where/Parser.java +831 -0
- data/src/main/java/org/embulk/filter/row/where/ParserExp.java +290 -0
- data/src/main/java/org/embulk/filter/row/where/ParserLiteral.java +277 -0
- data/src/main/java/org/embulk/filter/row/where/ParserNode.java +6 -0
- data/src/main/java/org/embulk/filter/row/where/ParserVal.java +78 -0
- data/src/main/java/org/embulk/filter/row/where/Yylex.java +833 -0
- data/src/main/java/org/embulk/filter/row/where/_lexer.l +108 -0
- data/src/main/java/org/embulk/filter/row/where/_parser.y +137 -0
- data/src/test/java/org/embulk/filter/row/where/TestParser.java +383 -0
- data/src/test/java/org/embulk/filter/row/where/TestYylex.java +256 -0
- metadata +19 -5
- data/classpath/embulk-filter-row-0.2.2.jar +0 -0
@@ -0,0 +1,256 @@
|
|
1
|
+
package org.embulk.filter.row.where;
|
2
|
+
|
3
|
+
import org.embulk.spi.Schema;
|
4
|
+
import org.embulk.spi.SchemaConfigException;
|
5
|
+
import org.embulk.spi.time.Timestamp;
|
6
|
+
import org.junit.Before;
|
7
|
+
import org.junit.Test;
|
8
|
+
|
9
|
+
import java.io.IOException;
|
10
|
+
|
11
|
+
import static org.embulk.spi.type.Types.BOOLEAN;
|
12
|
+
import static org.junit.Assert.assertEquals;
|
13
|
+
import static org.junit.Assert.assertTrue;
|
14
|
+
|
15
|
+
public class TestYylex
|
16
|
+
{
|
17
|
+
Parser yyparser;
|
18
|
+
Yylex lexer;
|
19
|
+
|
20
|
+
@Before
|
21
|
+
public void setUp()
|
22
|
+
{
|
23
|
+
yyparser = new Parser(Schema.builder().build());
|
24
|
+
}
|
25
|
+
|
26
|
+
void assertNextToken(int token)
|
27
|
+
{
|
28
|
+
try {
|
29
|
+
assertEquals(token, lexer.yylex());
|
30
|
+
}
|
31
|
+
catch (IOException e) {
|
32
|
+
e.printStackTrace();
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
ParserNode currentNode()
|
37
|
+
{
|
38
|
+
return (ParserNode)(yyparser.yylval.obj);
|
39
|
+
}
|
40
|
+
|
41
|
+
@Test
|
42
|
+
public void testOperator()
|
43
|
+
{
|
44
|
+
lexer = new Yylex("START_WITH", yyparser);
|
45
|
+
assertNextToken(Parser.START_WITH);
|
46
|
+
|
47
|
+
lexer = new Yylex("(", yyparser);
|
48
|
+
assertNextToken('(');
|
49
|
+
|
50
|
+
lexer = new Yylex(" = ", yyparser);
|
51
|
+
assertNextToken(Parser.EQ);
|
52
|
+
}
|
53
|
+
|
54
|
+
void assertIdentifier(String name)
|
55
|
+
{
|
56
|
+
assertEquals("IdentifierLiteral", currentNode().getClass().getSimpleName());
|
57
|
+
assertEquals(name, ((IdentifierLiteral)currentNode()).name);
|
58
|
+
}
|
59
|
+
|
60
|
+
@Test
|
61
|
+
public void testIdentifier()
|
62
|
+
{
|
63
|
+
Schema schema = Schema.builder()
|
64
|
+
.add("foobar", BOOLEAN)
|
65
|
+
.add("foo bar", BOOLEAN)
|
66
|
+
.add("foo\"bar", BOOLEAN)
|
67
|
+
.add("$.foo.bar", BOOLEAN) // Support JSONPath someday
|
68
|
+
.add("$['foo'][0:4][*]", BOOLEAN) // Support JSONPath someday
|
69
|
+
.build();
|
70
|
+
yyparser = new Parser(schema);
|
71
|
+
|
72
|
+
lexer = new Yylex("foobar", yyparser);
|
73
|
+
assertNextToken(Parser.IDENTIFIER);
|
74
|
+
assertIdentifier("foobar");
|
75
|
+
|
76
|
+
lexer = new Yylex(" foobar ", yyparser);
|
77
|
+
assertNextToken(Parser.IDENTIFIER);
|
78
|
+
assertIdentifier("foobar");
|
79
|
+
|
80
|
+
lexer = new Yylex("\"foobar\"", yyparser);
|
81
|
+
assertNextToken(Parser.IDENTIFIER);
|
82
|
+
assertIdentifier("foobar");
|
83
|
+
|
84
|
+
lexer = new Yylex(" \"foo bar\" ", yyparser);
|
85
|
+
assertNextToken(Parser.IDENTIFIER);
|
86
|
+
assertIdentifier("foo bar");
|
87
|
+
|
88
|
+
lexer = new Yylex(" \"foo\\\"bar\" ", yyparser);
|
89
|
+
assertNextToken(Parser.IDENTIFIER);
|
90
|
+
assertIdentifier("foo\"bar");
|
91
|
+
|
92
|
+
lexer = new Yylex("$.foo.bar", yyparser);
|
93
|
+
assertNextToken(Parser.IDENTIFIER);
|
94
|
+
assertIdentifier("$.foo.bar");
|
95
|
+
|
96
|
+
lexer = new Yylex("\"$['foo'][0:4][*]\"", yyparser);
|
97
|
+
assertNextToken(Parser.IDENTIFIER);
|
98
|
+
assertIdentifier("$['foo'][0:4][*]");
|
99
|
+
|
100
|
+
try {
|
101
|
+
lexer = new Yylex("$['foo'][0:4][*]", yyparser);
|
102
|
+
assertNextToken(Parser.IDENTIFIER);
|
103
|
+
assertTrue(false);
|
104
|
+
}
|
105
|
+
catch (SchemaConfigException e) {
|
106
|
+
}
|
107
|
+
|
108
|
+
try {
|
109
|
+
lexer = new Yylex("unknown", yyparser);
|
110
|
+
assertNextToken(Parser.IDENTIFIER);
|
111
|
+
assertTrue(false);
|
112
|
+
}
|
113
|
+
catch (SchemaConfigException e) {
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
void assertBoolean(boolean val)
|
118
|
+
{
|
119
|
+
assertEquals("BooleanLiteral", currentNode().getClass().getSimpleName());
|
120
|
+
assertEquals(val, ((BooleanLiteral)currentNode()).val);
|
121
|
+
}
|
122
|
+
|
123
|
+
@Test
|
124
|
+
public void testBoolean()
|
125
|
+
{
|
126
|
+
lexer = new Yylex("true", yyparser);
|
127
|
+
assertNextToken(Parser.BOOLEAN);
|
128
|
+
assertBoolean(true);
|
129
|
+
|
130
|
+
lexer = new Yylex("false", yyparser);
|
131
|
+
assertNextToken(Parser.BOOLEAN);
|
132
|
+
assertBoolean(false);
|
133
|
+
|
134
|
+
lexer = new Yylex("TRUE", yyparser);
|
135
|
+
assertNextToken(Parser.BOOLEAN);
|
136
|
+
assertBoolean(true);
|
137
|
+
|
138
|
+
lexer = new Yylex("FALSE", yyparser);
|
139
|
+
assertNextToken(Parser.BOOLEAN);
|
140
|
+
assertBoolean(false);
|
141
|
+
|
142
|
+
lexer = new Yylex(" true ", yyparser);
|
143
|
+
assertNextToken(Parser.BOOLEAN);
|
144
|
+
assertBoolean(true);
|
145
|
+
}
|
146
|
+
|
147
|
+
void assertNumber(double val)
|
148
|
+
{
|
149
|
+
assertEquals("NumberLiteral", currentNode().getClass().getSimpleName());
|
150
|
+
assertEquals(val, ((NumberLiteral)currentNode()).val, 0.0);
|
151
|
+
}
|
152
|
+
|
153
|
+
@Test
|
154
|
+
public void testNumber()
|
155
|
+
{
|
156
|
+
lexer = new Yylex("1.5", yyparser);
|
157
|
+
assertNextToken(Parser.NUMBER);
|
158
|
+
assertNumber(1.5);
|
159
|
+
|
160
|
+
lexer = new Yylex("1", yyparser);
|
161
|
+
assertNextToken(Parser.NUMBER);
|
162
|
+
assertNumber(1);
|
163
|
+
|
164
|
+
lexer = new Yylex("-1.5", yyparser);
|
165
|
+
assertNextToken(Parser.NUMBER);
|
166
|
+
assertNumber(-1.5);
|
167
|
+
|
168
|
+
lexer = new Yylex(" -1.5 ", yyparser);
|
169
|
+
assertNextToken(Parser.NUMBER);
|
170
|
+
assertNumber(-1.5);
|
171
|
+
}
|
172
|
+
|
173
|
+
void assertString(String val)
|
174
|
+
{
|
175
|
+
assertEquals("StringLiteral", currentNode().getClass().getSimpleName());
|
176
|
+
assertEquals(val, ((StringLiteral)currentNode()).val);
|
177
|
+
}
|
178
|
+
|
179
|
+
@Test
|
180
|
+
public void testString()
|
181
|
+
{
|
182
|
+
lexer = new Yylex("'foobar'", yyparser);
|
183
|
+
assertNextToken(Parser.STRING);
|
184
|
+
assertString("foobar");
|
185
|
+
|
186
|
+
lexer = new Yylex("'foo bar'", yyparser);
|
187
|
+
assertNextToken(Parser.STRING);
|
188
|
+
assertString("foo bar");
|
189
|
+
|
190
|
+
lexer = new Yylex("'foo\\'bar'", yyparser);
|
191
|
+
assertNextToken(Parser.STRING);
|
192
|
+
assertString("foo\'bar");
|
193
|
+
}
|
194
|
+
|
195
|
+
@Test
|
196
|
+
public void testTimestamp()
|
197
|
+
{
|
198
|
+
lexer = new Yylex("TIMESTAMP 1.5", yyparser);
|
199
|
+
assertNextToken(Parser.TIMESTAMP);
|
200
|
+
assertNextToken(Parser.NUMBER);
|
201
|
+
assertNumber(1.5);
|
202
|
+
|
203
|
+
lexer = new Yylex("TIMESTAMP '2015-01-01'", yyparser);
|
204
|
+
assertNextToken(Parser.TIMESTAMP);
|
205
|
+
assertNextToken(Parser.STRING);
|
206
|
+
assertString("2015-01-01");
|
207
|
+
}
|
208
|
+
|
209
|
+
@Test
|
210
|
+
public void testComplex()
|
211
|
+
{
|
212
|
+
Schema schema = Schema.builder()
|
213
|
+
.add("true", BOOLEAN)
|
214
|
+
.add("foobar", BOOLEAN)
|
215
|
+
.build();
|
216
|
+
yyparser = new Parser(schema);
|
217
|
+
|
218
|
+
lexer = new Yylex("( \"true\" = true OR \"true\" = false ) AND foobar = false", yyparser);
|
219
|
+
assertNextToken('(');
|
220
|
+
assertNextToken(Parser.IDENTIFIER);
|
221
|
+
assertNextToken(Parser.EQ);
|
222
|
+
assertNextToken(Parser.BOOLEAN);
|
223
|
+
assertNextToken(Parser.OR);
|
224
|
+
assertNextToken(Parser.IDENTIFIER);
|
225
|
+
assertNextToken(Parser.EQ);
|
226
|
+
assertNextToken(Parser.BOOLEAN);
|
227
|
+
assertNextToken(')');
|
228
|
+
assertNextToken(Parser.AND);
|
229
|
+
assertNextToken(Parser.IDENTIFIER);
|
230
|
+
assertNextToken(Parser.EQ);
|
231
|
+
assertNextToken(Parser.BOOLEAN);
|
232
|
+
|
233
|
+
lexer = new Yylex("(\"true\"=true OR\"true\"=false)AND foobar=false", yyparser);
|
234
|
+
assertNextToken('(');
|
235
|
+
assertNextToken(Parser.IDENTIFIER);
|
236
|
+
assertNextToken(Parser.EQ);
|
237
|
+
assertNextToken(Parser.BOOLEAN);
|
238
|
+
assertNextToken(Parser.OR);
|
239
|
+
assertNextToken(Parser.IDENTIFIER);
|
240
|
+
assertNextToken(Parser.EQ);
|
241
|
+
assertNextToken(Parser.BOOLEAN);
|
242
|
+
assertNextToken(')');
|
243
|
+
assertNextToken(Parser.AND);
|
244
|
+
assertNextToken(Parser.IDENTIFIER);
|
245
|
+
assertNextToken(Parser.EQ);
|
246
|
+
assertNextToken(Parser.BOOLEAN);
|
247
|
+
|
248
|
+
lexer = new Yylex("NOT(true=\"true\")", yyparser);
|
249
|
+
assertNextToken(Parser.NOT);
|
250
|
+
assertNextToken('(');
|
251
|
+
assertNextToken(Parser.BOOLEAN);
|
252
|
+
assertNextToken(Parser.EQ);
|
253
|
+
assertNextToken(Parser.IDENTIFIER);
|
254
|
+
assertNextToken(')');
|
255
|
+
}
|
256
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-filter-row
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Naotoshi Seo
|
@@ -56,15 +56,19 @@ files:
|
|
56
56
|
- example/example.csv
|
57
57
|
- example/example.yml
|
58
58
|
- example/or.yml
|
59
|
+
- example/where.yml
|
59
60
|
- gradle/wrapper/gradle-wrapper.jar
|
60
61
|
- gradle/wrapper/gradle-wrapper.properties
|
61
62
|
- gradlew
|
62
63
|
- gradlew.bat
|
63
64
|
- lib/embulk/filter/row.rb
|
65
|
+
- script/byaccj.sh
|
64
66
|
- settings.gradle
|
65
|
-
- src/main/java/org/embulk/filter/row/
|
66
|
-
- src/main/java/org/embulk/filter/row/
|
67
|
-
- src/main/java/org/embulk/filter/row/
|
67
|
+
- src/main/java/org/embulk/filter/row/AbstractGuardColumnVisitor.java
|
68
|
+
- src/main/java/org/embulk/filter/row/BuildColumnVisitorImpl.java
|
69
|
+
- src/main/java/org/embulk/filter/row/GuardColumnVisitorAndImpl.java
|
70
|
+
- src/main/java/org/embulk/filter/row/GuardColumnVisitorOrImpl.java
|
71
|
+
- src/main/java/org/embulk/filter/row/GuardColumnVisitorWhereImpl.java
|
68
72
|
- src/main/java/org/embulk/filter/row/RowFilterPlugin.java
|
69
73
|
- src/main/java/org/embulk/filter/row/condition/BooleanCondition.java
|
70
74
|
- src/main/java/org/embulk/filter/row/condition/Condition.java
|
@@ -74,13 +78,23 @@ files:
|
|
74
78
|
- src/main/java/org/embulk/filter/row/condition/LongCondition.java
|
75
79
|
- src/main/java/org/embulk/filter/row/condition/StringCondition.java
|
76
80
|
- src/main/java/org/embulk/filter/row/condition/TimestampCondition.java
|
81
|
+
- src/main/java/org/embulk/filter/row/where/Parser.java
|
82
|
+
- src/main/java/org/embulk/filter/row/where/ParserExp.java
|
83
|
+
- src/main/java/org/embulk/filter/row/where/ParserLiteral.java
|
84
|
+
- src/main/java/org/embulk/filter/row/where/ParserNode.java
|
85
|
+
- src/main/java/org/embulk/filter/row/where/ParserVal.java
|
86
|
+
- src/main/java/org/embulk/filter/row/where/Yylex.java
|
87
|
+
- src/main/java/org/embulk/filter/row/where/_lexer.l
|
88
|
+
- src/main/java/org/embulk/filter/row/where/_parser.y
|
77
89
|
- src/test/java/org/embulk/filter/row/condition/TestBooleanCondition.java
|
78
90
|
- src/test/java/org/embulk/filter/row/condition/TestConditionFactory.java
|
79
91
|
- src/test/java/org/embulk/filter/row/condition/TestDoubleCondition.java
|
80
92
|
- src/test/java/org/embulk/filter/row/condition/TestLongCondition.java
|
81
93
|
- src/test/java/org/embulk/filter/row/condition/TestStringCondition.java
|
82
94
|
- src/test/java/org/embulk/filter/row/condition/TestTimestampCondition.java
|
83
|
-
-
|
95
|
+
- src/test/java/org/embulk/filter/row/where/TestParser.java
|
96
|
+
- src/test/java/org/embulk/filter/row/where/TestYylex.java
|
97
|
+
- classpath/embulk-filter-row-0.3.0.jar
|
84
98
|
homepage: https://github.com/sonots/embulk-filter-row
|
85
99
|
licenses:
|
86
100
|
- MIT
|
Binary file
|