embulk-filter-row 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/CHANGELOG.md +6 -0
  4. data/README.md +124 -4
  5. data/build.gradle +15 -4
  6. data/classpath/embulk-filter-row-0.3.0.jar +0 -0
  7. data/example/and.yml +0 -7
  8. data/example/example.yml +0 -7
  9. data/example/where.yml +28 -0
  10. data/script/byaccj.sh +29 -0
  11. data/src/main/java/org/embulk/filter/row/{AbstractColumnVisitor.java → AbstractGuardColumnVisitor.java} +9 -17
  12. data/src/main/java/org/embulk/filter/row/BuildColumnVisitorImpl.java +98 -0
  13. data/src/main/java/org/embulk/filter/row/{ColumnVisitorAndImpl.java → GuardColumnVisitorAndImpl.java} +11 -45
  14. data/src/main/java/org/embulk/filter/row/{ColumnVisitorOrImpl.java → GuardColumnVisitorOrImpl.java} +11 -45
  15. data/src/main/java/org/embulk/filter/row/GuardColumnVisitorWhereImpl.java +28 -0
  16. data/src/main/java/org/embulk/filter/row/RowFilterPlugin.java +49 -16
  17. data/src/main/java/org/embulk/filter/row/where/Parser.java +831 -0
  18. data/src/main/java/org/embulk/filter/row/where/ParserExp.java +290 -0
  19. data/src/main/java/org/embulk/filter/row/where/ParserLiteral.java +277 -0
  20. data/src/main/java/org/embulk/filter/row/where/ParserNode.java +6 -0
  21. data/src/main/java/org/embulk/filter/row/where/ParserVal.java +78 -0
  22. data/src/main/java/org/embulk/filter/row/where/Yylex.java +833 -0
  23. data/src/main/java/org/embulk/filter/row/where/_lexer.l +108 -0
  24. data/src/main/java/org/embulk/filter/row/where/_parser.y +137 -0
  25. data/src/test/java/org/embulk/filter/row/where/TestParser.java +383 -0
  26. data/src/test/java/org/embulk/filter/row/where/TestYylex.java +256 -0
  27. metadata +19 -5
  28. data/classpath/embulk-filter-row-0.2.2.jar +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e658f035d50a57d97df3a874a87754e0eafc3114
4
- data.tar.gz: 505d52511a7527b4bab0585a075548af27ed0c7e
3
+ metadata.gz: 50dcbbafd3bb2429121a86d74143612f79ca4570
4
+ data.tar.gz: ee2a1c37ef931525a43764976d258004b1d24f8e
5
5
  SHA512:
6
- metadata.gz: c0943ff3946f42199d898326419677f74d2b162a7d515b3ce6f6847b162b08e4469af946e42ddc61c50a4c0b3c6ca2b35530bc880a5531d60e3102c873c066a6
7
- data.tar.gz: e21c28850e48e2d9d816ca8922e2ae7019cb2828976b99807f9f063190f492f89397e32b6648b2aeab4d0e20e08e3b66b987f66d606c121691c06c1be766a341
6
+ metadata.gz: 016cc549f49bdc513c9a92e7550779484c1d0a3a8d465f00de6be3db9ee94b39ed280dd9423ae592562f0366b671aeb54eacd612a8a8f3a7fe4494d99ee6959a
7
+ data.tar.gz: cc67e9ae035b6ccb4d9c5892b9f638ed51910061c38061040a3c526f0f316c1ae5f61d57aea79aa4ba94ef588382d1b1011efbbb36a0eef779cd6606779f8107
data/.gitignore CHANGED
@@ -10,3 +10,6 @@ build/
10
10
  .tags
11
11
  .ruby-version
12
12
  *.iml
13
+ *.class
14
+ script/yacc
15
+ script/jflex*
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.3.0 (2016-08-06)
2
+
3
+ Enhancements:
4
+
5
+ * Support SQL-like Syntax
6
+
1
7
  # 0.2.2 (2016-08-05)
2
8
 
3
9
  Enhancements:
data/README.md CHANGED
@@ -33,6 +33,7 @@ A filter plugin for Embulk to filter out rows
33
33
  * **not**: not (boolean, optional, default: false)
34
34
  * **format**: special option for timestamp column, specify the format of timestamp argument, parsed argument is compared with the column value as Timestamp object (string, default is `%Y-%m-%d %H:%M:%S.%N %z`)
35
35
  * **timezone**: special option for timestamp column, specify the timezone of timestamp argument (string, default is `UTC`)
36
+ * **where** (experimental): Write conditions with SQL-like syntax. See [SQL-like Syntax](#sql-like-syntax)
36
37
 
37
38
  NOTE: column type is automatically retrieved from input data (inputSchema)
38
39
 
@@ -63,7 +64,7 @@ filters:
63
64
 
64
65
  ## Example (AND of OR)
65
66
 
66
- embulk-filter-row does not directly supports complex conditions such as `((A OR B) AND (C OR D))`, but you should be able to express most of complex conditions by combining multiple filters like
67
+ You can express a condition such as `(A OR B) AND (C OR D)` by combining multiple filters like
67
68
 
68
69
  ```yaml
69
70
  filters:
@@ -81,10 +82,129 @@ filters:
81
82
 
82
83
  This is equivalent with `((A OR B) AND (C OR D))`.
83
84
 
84
- ## Not Supported: More Complex Conditions
85
+ ## Example (WHERE) (Experimental)
85
86
 
86
- * It should be better to think using Query engine like [Apache Drill](https://drill.apache.org/) or [Presto](https://prestodb.io/)
87
- * With them, it is possible to send a query to local files, even to S3 files.
87
+ Versions >= 0.3.0 suppors SQL-like syntax like
88
+
89
+ ```yaml
90
+ filters:
91
+ - type: row
92
+ where: |-
93
+ (
94
+ string START_WITH 'str' AND
95
+ number > 1.0
96
+ )
97
+ OR
98
+ (
99
+ time = TIMESTAMP '2016-01-01 +0900' AND
100
+ "true" = true
101
+ )
102
+ ```
103
+
104
+ See [SQL-like Syntax](#sql-like-syntax) for more details
105
+
106
+ # SQL-like Syntax
107
+
108
+ Versions >= 0.3.0 suppors SQL-like syntax as:
109
+
110
+ ```
111
+ where: |-
112
+ (
113
+ string START_WITH 'str' AND
114
+ number > 1.0
115
+ )
116
+ OR
117
+ (
118
+ time = TIMESTAMP '2016-01-01 +0900' AND
119
+ "true" = true
120
+ )
121
+ ```
122
+
123
+ ## Literals
124
+
125
+ ### Boolean Literal
126
+
127
+ `true` or `TRUE` or `false` or `FALSE` are considered as a boolean literal
128
+
129
+ ### Number Literal
130
+
131
+ Characters matching with a regular expression `-?[0-9]+(\.[0-9]+)?` is considered as a number literal
132
+
133
+ ### String Literal
134
+
135
+ Characters surrounded by `'` such as `'foo'` is considered as a string literal
136
+
137
+ ### Timestamp Literal
138
+
139
+ `TIMESTAMP ( NumberLiteral | StringLiteral )` such as `TIMESTAMP 1470433087.747123` or `TIMESTAMP '2016-08-06 06:38:07.747123 +0900'` is considered as a timestamp literal
140
+
141
+ Number is a epoch time since 1970-01-01 UTC with nano time resolution.
142
+
143
+ String is a timestamp string which matches with one of following format:
144
+
145
+ * `%Y-%m-%d %H:%M:%S.%N %z`
146
+ * `%Y-%m-%d %H:%M:%S.%N`
147
+ * `%Y-%m-%d %H:%M:%S %z`
148
+ * `%Y-%m-%d %H:%M:%S`
149
+ * `%Y-%m-%d %z`
150
+ * `%Y-%m-%d`
151
+
152
+ The default time zone is UTC, and the time resolution is micro second (caused by limitation of Embulk TimestampParser).
153
+
154
+ ### Json Literal
155
+
156
+ Not supported yet
157
+
158
+ ### Identifier Literal
159
+
160
+ Characters matching with a regular expression `[a-zA-Z$][a-zA-z0-9\.\-_]*` such as `foobar`, and characters surrounded by `"` such as `"foo\"bar"` are considred as an identifier literal, that is, embulk's column name.
161
+
162
+ ## Operators
163
+
164
+ ### Boolean Operator
165
+
166
+ * ==
167
+ * !=
168
+
169
+ ### Number Operator (Long and Double)
170
+
171
+ * ==
172
+ * !=
173
+ * >
174
+ * >=
175
+ * <=
176
+ * <
177
+
178
+ ### String Operator
179
+
180
+ * ==
181
+ * !=
182
+ * START_WITH
183
+ * END_WITH
184
+ * INCLUDE
185
+
186
+ ### Timestamp Operator
187
+
188
+ * ==
189
+ * !=
190
+ * >
191
+ * >=
192
+ * <=
193
+ * <
194
+
195
+ ### Json Operator
196
+
197
+ Not supported yet
198
+
199
+ ### unary operator
200
+
201
+ * "xxx IS NULL"
202
+ * "xxx IS NOT NULL"
203
+ * "NOT xxx"
204
+
205
+ ## ToDo
206
+
207
+ * Support filtering by values of `type: json` with JSONPath
88
208
 
89
209
  ## ChangeLog
90
210
 
data/build.gradle CHANGED
@@ -3,6 +3,8 @@ plugins {
3
3
  id "com.github.jruby-gradle.base" version "0.1.5"
4
4
  id "java"
5
5
  id "checkstyle"
6
+ id "jacoco"
7
+ id "findbugs"
6
8
  }
7
9
  import com.github.jrubygradle.JRubyExec
8
10
  repositories {
@@ -13,21 +15,30 @@ configurations {
13
15
  provided
14
16
  }
15
17
 
16
- version = "0.2.2"
18
+ version = "0.3.0"
17
19
  sourceCompatibility = 1.7
18
20
  targetCompatibility = 1.7
19
21
 
20
22
  dependencies {
21
- compile "org.embulk:embulk-core:0.8.11"
22
- provided "org.embulk:embulk-core:0.8.11"
23
- // compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION"
23
+ compile "org.embulk:embulk-core:0.8.+"
24
+ provided "org.embulk:embulk-core:0.8.+"
25
+
24
26
  testCompile "junit:junit:4.+"
27
+ testCompile "org.embulk:embulk-core:0.8.+:tests"
28
+ testCompile "org.embulk:embulk-standards:0.8.+"
25
29
  }
26
30
 
27
31
  checkstyle {
28
32
  toolVersion = '6.7'
29
33
  }
30
34
 
35
+ task byaccj() {
36
+ [file("script/byaccj.sh")].execute()
37
+ }
38
+
39
+ // append dependsOn to compileJava task
40
+ compileJava.dependsOn(byaccj)
41
+
31
42
  task classpath(type: Copy, dependsOn: ["jar"]) {
32
43
  doFirst { file("classpath").deleteDir() }
33
44
  from (configurations.runtime - configurations.provided + files(jar.archivePath))
data/example/and.yml CHANGED
@@ -1,10 +1,3 @@
1
- # in:
2
- # type: random
3
- # rows: 100
4
- # schema:
5
- # id: primary_key
6
- # name: string
7
- # score: integer
8
1
  in:
9
2
  type: file
10
3
  path_prefix: example/example.csv
data/example/example.yml CHANGED
@@ -1,10 +1,3 @@
1
- # in:
2
- # type: random
3
- # rows: 100
4
- # schema:
5
- # id: primary_key
6
- # name: string
7
- # score: integer
8
1
  in:
9
2
  type: file
10
3
  path_prefix: example/example.csv
data/example/where.yml ADDED
@@ -0,0 +1,28 @@
1
+ in:
2
+ type: file
3
+ path_prefix: example/example.csv
4
+ parser:
5
+ type: csv
6
+ charset: UTF-8
7
+ newline: CRLF
8
+ null_string: "NULL"
9
+ skip_header_lines: 1
10
+ comment_line_marker: '#'
11
+ columns:
12
+ - {name: time, type: timestamp, format: "%Y-%m-%d"}
13
+ - {name: foo, type: string}
14
+ - {name: bar, type: string}
15
+ - {name: flag, type: boolean}
16
+ - {name: id, type: long}
17
+ - {name: name, type: string}
18
+ - {name: json, type: json}
19
+ - {name: score, type: double}
20
+ filters:
21
+ - type: row
22
+ where: |-
23
+ (time = TIMESTAMP '2015-07-13' AND
24
+ foo IS NULL AND
25
+ bar = 'bar' AND score>2000 AND
26
+ flag=false) OR (id=9)
27
+ out:
28
+ type: stdout
data/script/byaccj.sh ADDED
@@ -0,0 +1,29 @@
1
+ #!/bin/bash -e
2
+ BYACCJ_VERSION="1.15"
3
+ JFLEX_VERSION="1.6.1"
4
+
5
+ ROOT_PATH=$(cd $(dirname $0); cd ..; pwd)
6
+ SRC_DIR="src/main/java/org/embulk/filter/row/where"
7
+
8
+ if [ $(uname) = "Darwin" ]; then
9
+ platform="macosx"
10
+ else
11
+ platform="linux"
12
+ fi
13
+
14
+ if [ ! -f "$ROOT_PATH/script/yacc" ]; then
15
+ curl -s -L "http://downloads.sourceforge.net/project/byaccj/byaccj/${BYACCJ_VERSION}/byaccj${BYACCJ_VERSION}_${platform}.tar.gz" | tar xz -C $ROOT_PATH/script/
16
+ mv $ROOT_PATH/script/yacc.${platform} $ROOT_PATH/script/yacc
17
+ chmod a+x $ROOT_PATH/script/yacc
18
+ fi
19
+
20
+ if [ ! -L "$ROOT_PATH/script/jflex" ]; then
21
+ curl -s -L "http://jflex.de/release/jflex-${JFLEX_VERSION}.tar.gz" | tar xz -C $ROOT_PATH/script/
22
+ fi
23
+
24
+ # yacc
25
+ $ROOT_PATH/script/yacc -J -Jclass=Parser -Jpackage=org.embulk.filter.row.where -Jnoconstruct "$SRC_DIR/_parser.y"
26
+ mv Parser.java ParserVal.java $SRC_DIR/
27
+
28
+ # flex
29
+ $ROOT_PATH/script/jflex/bin/jflex -d $SRC_DIR "$SRC_DIR/_lexer.l"
@@ -6,8 +6,6 @@ import org.embulk.filter.row.condition.Condition;
6
6
  import org.embulk.filter.row.condition.ConditionConfig;
7
7
  import org.embulk.filter.row.condition.ConditionFactory;
8
8
  import org.embulk.spi.Column;
9
- import org.embulk.spi.ColumnVisitor;
10
- import org.embulk.spi.PageBuilder;
11
9
  import org.embulk.spi.PageReader;
12
10
  import org.embulk.spi.Schema;
13
11
 
@@ -15,25 +13,19 @@ import java.util.ArrayList;
15
13
  import java.util.HashMap;
16
14
  import java.util.List;
17
15
 
18
- abstract class AbstractColumnVisitor
19
- implements ColumnVisitor
16
+ abstract class AbstractGuardColumnVisitor
20
17
  {
21
- final PluginTask task;
22
- final Schema inputSchema;
23
- final Schema outputSchema;
24
- final PageReader pageReader;
25
- final PageBuilder pageBuilder;
26
- HashMap<String, List<Condition>> conditionMap;
27
-
28
- AbstractColumnVisitor(PluginTask task, Schema inputSchema, Schema outputSchema, PageReader pageReader, PageBuilder pageBuilder)
18
+ PluginTask task;
19
+ Schema inputSchema;
20
+ Schema outputSchema;
21
+ PageReader pageReader;
22
+
23
+ AbstractGuardColumnVisitor(PluginTask task, Schema inputSchema, Schema outputSchema, PageReader pageReader)
29
24
  {
30
25
  this.task = task;
31
26
  this.inputSchema = inputSchema;
32
27
  this.outputSchema = outputSchema;
33
28
  this.pageReader = pageReader;
34
- this.pageBuilder = pageBuilder;
35
-
36
- this.conditionMap = buildConditionMap(task, outputSchema);
37
29
  }
38
30
 
39
31
  static HashMap<String, List<Condition>> buildConditionMap(PluginTask task, Schema outputSchema)
@@ -44,7 +36,7 @@ abstract class AbstractColumnVisitor
44
36
  conditionMap.put(columnName, new ArrayList<Condition>());
45
37
  }
46
38
 
47
- for (ConditionConfig conditionConfig : task.getConditions()) {
39
+ for (ConditionConfig conditionConfig : task.getConditions().get()) {
48
40
  String columnName = conditionConfig.getColumn();
49
41
  for (Column column : outputSchema.getColumns()) {
50
42
  if (columnName.equals(column.getName())) {
@@ -58,5 +50,5 @@ abstract class AbstractColumnVisitor
58
50
  return conditionMap;
59
51
  }
60
52
 
61
- abstract public boolean visitColumns(Schema schema);
53
+ abstract public boolean visitColumns(Schema inputSchema);
62
54
  }
@@ -0,0 +1,98 @@
1
+ package org.embulk.filter.row;
2
+
3
+ import org.embulk.filter.row.RowFilterPlugin.PluginTask;
4
+
5
+ import org.embulk.spi.Column;
6
+ import org.embulk.spi.ColumnVisitor;
7
+ import org.embulk.spi.Exec;
8
+ import org.embulk.spi.PageBuilder;
9
+ import org.embulk.spi.PageReader;
10
+ import org.embulk.spi.Schema;
11
+
12
+ import org.slf4j.Logger;
13
+
14
+ public class BuildColumnVisitorImpl
15
+ implements ColumnVisitor
16
+ {
17
+ private static final Logger logger = Exec.getLogger(RowFilterPlugin.class);
18
+ private final PluginTask task;
19
+ private final Schema inputSchema;
20
+ private final Schema outputSchema;
21
+ private final PageReader pageReader;
22
+ private final PageBuilder pageBuilder;
23
+
24
+ BuildColumnVisitorImpl(PluginTask task, Schema inputSchema, Schema outputSchema, PageReader pageReader, PageBuilder pageBuilder)
25
+ {
26
+ this.task = task;
27
+ this.inputSchema = inputSchema;
28
+ this.outputSchema = outputSchema;
29
+ this.pageReader = pageReader;
30
+ this.pageBuilder = pageBuilder;
31
+ }
32
+
33
+ @Override
34
+ public void booleanColumn(Column column)
35
+ {
36
+ if (pageReader.isNull(column)) {
37
+ pageBuilder.setNull(column);
38
+ }
39
+ else {
40
+ pageBuilder.setBoolean(column, pageReader.getBoolean(column));
41
+ }
42
+ }
43
+
44
+ @Override
45
+ public void longColumn(Column column)
46
+ {
47
+ if (pageReader.isNull(column)) {
48
+ pageBuilder.setNull(column);
49
+ }
50
+ else {
51
+ pageBuilder.setLong(column, pageReader.getLong(column));
52
+ }
53
+ }
54
+
55
+ @Override
56
+ public void doubleColumn(Column column)
57
+ {
58
+ if (pageReader.isNull(column)) {
59
+ pageBuilder.setNull(column);
60
+ }
61
+ else {
62
+ pageBuilder.setDouble(column, pageReader.getDouble(column));
63
+ }
64
+ }
65
+
66
+ @Override
67
+ public void stringColumn(Column column)
68
+ {
69
+ if (pageReader.isNull(column)) {
70
+ pageBuilder.setNull(column);
71
+ }
72
+ else {
73
+ pageBuilder.setString(column, pageReader.getString(column));
74
+ }
75
+ }
76
+
77
+ @Override
78
+ public void timestampColumn(Column column)
79
+ {
80
+ if (pageReader.isNull(column)) {
81
+ pageBuilder.setNull(column);
82
+ }
83
+ else {
84
+ pageBuilder.setTimestamp(column, pageReader.getTimestamp(column));
85
+ }
86
+ }
87
+
88
+ @Override
89
+ public void jsonColumn(Column column)
90
+ {
91
+ if (pageReader.isNull(column)) {
92
+ pageBuilder.setNull(column);
93
+ }
94
+ else {
95
+ pageBuilder.setJson(column, pageReader.getJson(column));
96
+ }
97
+ }
98
+ }
@@ -9,32 +9,37 @@ import org.embulk.filter.row.condition.StringCondition;
9
9
  import org.embulk.filter.row.condition.TimestampCondition;
10
10
 
11
11
  import org.embulk.spi.Column;
12
+ import org.embulk.spi.ColumnVisitor;
12
13
  import org.embulk.spi.Exec;
13
- import org.embulk.spi.PageBuilder;
14
14
  import org.embulk.spi.PageReader;
15
15
  import org.embulk.spi.Schema;
16
16
  import org.embulk.spi.time.Timestamp;
17
17
 
18
18
  import org.slf4j.Logger;
19
19
 
20
+ import java.util.HashMap;
20
21
  import java.util.List;
21
22
 
22
- class ColumnVisitorAndImpl extends AbstractColumnVisitor
23
+ class GuardColumnVisitorAndImpl
24
+ extends AbstractGuardColumnVisitor
25
+ implements ColumnVisitor
23
26
  {
24
27
  private static final Logger logger = Exec.getLogger(RowFilterPlugin.class);
25
28
  private boolean shouldAddRecord;
29
+ private HashMap<String, List<Condition>> conditionMap;
26
30
 
27
- ColumnVisitorAndImpl(PluginTask task, Schema inputSchema, Schema outputSchema, PageReader pageReader, PageBuilder pageBuilder)
31
+ GuardColumnVisitorAndImpl(PluginTask task, Schema inputSchema, Schema outputSchema, PageReader pageReader)
28
32
  {
29
- super(task, inputSchema, outputSchema, pageReader, pageBuilder);
33
+ super(task, inputSchema, outputSchema, pageReader);
34
+ this.conditionMap = buildConditionMap(task, outputSchema);
30
35
  }
31
36
 
32
- public boolean visitColumns(Schema schema)
37
+ public boolean visitColumns(Schema inputSchema)
33
38
  {
34
39
  //Visitor objects are created for each thread :)
35
40
  //System.out.println(String.format("thread_id:%d object_id:%d", Thread.currentThread().getId(), this.hashCode()));
36
41
  shouldAddRecord = true;
37
- for (Column column : schema.getColumns()) {
42
+ for (Column column : inputSchema.getColumns()) {
38
43
  column.visit(this);
39
44
  }
40
45
  return shouldAddRecord;
@@ -63,12 +68,6 @@ class ColumnVisitorAndImpl extends AbstractColumnVisitor
63
68
  }
64
69
  }
65
70
  }
66
- if (pageReader.isNull(column)) {
67
- pageBuilder.setNull(column);
68
- }
69
- else {
70
- pageBuilder.setBoolean(column, pageReader.getBoolean(column));
71
- }
72
71
  }
73
72
 
74
73
  @Override
@@ -94,12 +93,6 @@ class ColumnVisitorAndImpl extends AbstractColumnVisitor
94
93
  }
95
94
  }
96
95
  }
97
- if (pageReader.isNull(column)) {
98
- pageBuilder.setNull(column);
99
- }
100
- else {
101
- pageBuilder.setLong(column, pageReader.getLong(column));
102
- }
103
96
  }
104
97
 
105
98
  @Override
@@ -125,12 +118,6 @@ class ColumnVisitorAndImpl extends AbstractColumnVisitor
125
118
  }
126
119
  }
127
120
  }
128
- if (pageReader.isNull(column)) {
129
- pageBuilder.setNull(column);
130
- }
131
- else {
132
- pageBuilder.setDouble(column, pageReader.getDouble(column));
133
- }
134
121
  }
135
122
 
136
123
  @Override
@@ -156,12 +143,6 @@ class ColumnVisitorAndImpl extends AbstractColumnVisitor
156
143
  }
157
144
  }
158
145
  }
159
- if (pageReader.isNull(column)) {
160
- pageBuilder.setNull(column);
161
- }
162
- else {
163
- pageBuilder.setString(column, pageReader.getString(column));
164
- }
165
146
  }
166
147
 
167
148
  @Override
@@ -187,25 +168,10 @@ class ColumnVisitorAndImpl extends AbstractColumnVisitor
187
168
  }
188
169
  }
189
170
  }
190
- if (pageReader.isNull(column)) {
191
- pageBuilder.setNull(column);
192
- }
193
- else {
194
- pageBuilder.setTimestamp(column, pageReader.getTimestamp(column));
195
- }
196
171
  }
197
172
 
198
173
  @Override
199
174
  public void jsonColumn(Column column)
200
175
  {
201
- if (!shouldAddRecord) {
202
- return;
203
- }
204
- if (pageReader.isNull(column)) {
205
- pageBuilder.setNull(column);
206
- }
207
- else {
208
- pageBuilder.setJson(column, pageReader.getJson(column));
209
- }
210
176
  }
211
177
  }