Skip to content

Commit 25aa716

Browse files
committed
Simplify user defined predicates with state
1 parent 40d394a commit 25aa716

File tree

12 files changed

+129
-200
lines changed

12 files changed

+129
-200
lines changed

parquet-column/src/main/java/parquet/filter2/predicate/FilterApi.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import parquet.filter2.predicate.Operators.BinaryColumn;
88
import parquet.filter2.predicate.Operators.BooleanColumn;
99
import parquet.filter2.predicate.Operators.Column;
10-
import parquet.filter2.predicate.Operators.ConfiguredUserDefined;
1110
import parquet.filter2.predicate.Operators.DoubleColumn;
1211
import parquet.filter2.predicate.Operators.Eq;
1312
import parquet.filter2.predicate.Operators.FloatColumn;
@@ -23,6 +22,8 @@
2322
import parquet.filter2.predicate.Operators.SupportsEqNotEq;
2423
import parquet.filter2.predicate.Operators.SupportsLtGt;
2524
import parquet.filter2.predicate.Operators.UserDefined;
25+
import parquet.filter2.predicate.Operators.UserDefinedByClass;
26+
import parquet.filter2.predicate.Operators.UserDefinedByInstance;
2627

2728
/**
2829
* The Filter API is expressed through these static methods.
@@ -147,18 +148,23 @@ public static <T extends Comparable<T>, C extends Column<T> & SupportsLtGt> GtEq
147148

148149
/**
149150
* Keeps records that pass the provided {@link UserDefinedPredicate}
151+
*
152+
* The provided class must have a default constructor. To use an instance
153+
* of a UserDefinedPredicate instead, see {@link #userDefined(column, udp)} below.
150154
*/
151155
public static <T extends Comparable<T>, U extends UserDefinedPredicate<T>>
152156
UserDefined<T, U> userDefined(Column<T> column, Class<U> clazz) {
153-
return new UserDefined<T, U>(column, clazz);
157+
return new UserDefinedByClass<T, U>(column, clazz);
154158
}
155159

156160
/**
157-
* Similar to above but allows to pass Serializable {@link UserDefinedPredicate}
161+
* Keeps records that pass the provided {@link UserDefinedPredicate}
162+
*
163+
* The provided instance of UserDefinedPredicate must be serializable.
158164
*/
159165
public static <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable>
160-
ConfiguredUserDefined<T, U> userDefined(Column<T> column, U udp) {
161-
return new ConfiguredUserDefined<T, U> (column, udp);
166+
UserDefined<T, U> userDefined(Column<T> column, U udp) {
167+
return new UserDefinedByInstance<T, U>(column, udp);
162168
}
163169

164170
/**

parquet-column/src/main/java/parquet/filter2/predicate/FilterPredicate.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
package parquet.filter2.predicate;
22

3-
import java.io.Serializable;
4-
53
import parquet.filter2.predicate.Operators.And;
6-
import parquet.filter2.predicate.Operators.ConfiguredUserDefined;
74
import parquet.filter2.predicate.Operators.Eq;
85
import parquet.filter2.predicate.Operators.Gt;
96
import parquet.filter2.predicate.Operators.GtEq;
107
import parquet.filter2.predicate.Operators.LogicalNotUserDefined;
11-
import parquet.filter2.predicate.Operators.LogicalNotConfiguredUserDefined;
128
import parquet.filter2.predicate.Operators.Lt;
139
import parquet.filter2.predicate.Operators.LtEq;
1410
import parquet.filter2.predicate.Operators.Not;
@@ -52,9 +48,7 @@ public static interface Visitor<R> {
5248
R visit(Or or);
5349
R visit(Not not);
5450
<T extends Comparable<T>, U extends UserDefinedPredicate<T>> R visit(UserDefined<T, U> udp);
55-
<T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> R visit(ConfiguredUserDefined<T, U> udp);
5651
<T extends Comparable<T>, U extends UserDefinedPredicate<T>> R visit(LogicalNotUserDefined<T, U> udp);
57-
<T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> R visit(LogicalNotConfiguredUserDefined<T, U> udp);
5852
}
5953

6054
}

parquet-column/src/main/java/parquet/filter2/predicate/LogicalInverseRewriter.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package parquet.filter2.predicate;
22

3-
import java.io.Serializable;
4-
53
import parquet.filter2.predicate.FilterPredicate.Visitor;
64
import parquet.filter2.predicate.Operators.And;
7-
import parquet.filter2.predicate.Operators.ConfiguredUserDefined;
85
import parquet.filter2.predicate.Operators.Eq;
96
import parquet.filter2.predicate.Operators.Gt;
107
import parquet.filter2.predicate.Operators.GtEq;
118
import parquet.filter2.predicate.Operators.LogicalNotUserDefined;
12-
import parquet.filter2.predicate.Operators.LogicalNotConfiguredUserDefined;
139
import parquet.filter2.predicate.Operators.Lt;
1410
import parquet.filter2.predicate.Operators.LtEq;
1511
import parquet.filter2.predicate.Operators.Not;
@@ -92,18 +88,8 @@ public <T extends Comparable<T>, U extends UserDefinedPredicate<T>> FilterPredic
9288
return udp;
9389
}
9490

95-
@Override
96-
public <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> FilterPredicate visit(ConfiguredUserDefined<T, U> udp) {
97-
return udp;
98-
}
99-
10091
@Override
10192
public <T extends Comparable<T>, U extends UserDefinedPredicate<T>> FilterPredicate visit(LogicalNotUserDefined<T, U> udp) {
10293
return udp;
10394
}
104-
105-
@Override
106-
public <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> FilterPredicate visit(LogicalNotConfiguredUserDefined<T, U> udp) {
107-
return udp;
108-
}
10995
}

parquet-column/src/main/java/parquet/filter2/predicate/LogicalInverter.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package parquet.filter2.predicate;
22

3-
import java.io.Serializable;
4-
53
import parquet.filter2.predicate.FilterPredicate.Visitor;
64
import parquet.filter2.predicate.Operators.And;
7-
import parquet.filter2.predicate.Operators.ConfiguredUserDefined;
85
import parquet.filter2.predicate.Operators.Eq;
96
import parquet.filter2.predicate.Operators.Gt;
107
import parquet.filter2.predicate.Operators.GtEq;
118
import parquet.filter2.predicate.Operators.LogicalNotUserDefined;
12-
import parquet.filter2.predicate.Operators.LogicalNotConfiguredUserDefined;
139
import parquet.filter2.predicate.Operators.Lt;
1410
import parquet.filter2.predicate.Operators.LtEq;
1511
import parquet.filter2.predicate.Operators.Not;
@@ -87,18 +83,8 @@ public <T extends Comparable<T>, U extends UserDefinedPredicate<T>> FilterPredi
8783
return new LogicalNotUserDefined<T, U>(udp);
8884
}
8985

90-
@Override
91-
public <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> FilterPredicate visit(ConfiguredUserDefined<T, U> udp) {
92-
return new LogicalNotConfiguredUserDefined<T, U>(udp);
93-
}
94-
9586
@Override
9687
public <T extends Comparable<T>, U extends UserDefinedPredicate<T>> FilterPredicate visit(LogicalNotUserDefined<T, U> udp) {
9788
return udp.getUserDefined();
9889
}
99-
100-
@Override
101-
public <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> FilterPredicate visit(LogicalNotConfiguredUserDefined<T, U> udp) {
102-
return udp.getUserDefined();
103-
}
10490
}

parquet-column/src/main/java/parquet/filter2/predicate/Operators.java

Lines changed: 36 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -340,15 +340,33 @@ public int hashCode() {
340340
}
341341
}
342342

343-
public static final class UserDefined<T extends Comparable<T>, U extends UserDefinedPredicate<T>> implements FilterPredicate, Serializable {
344-
private final Column<T> column;
343+
public static abstract class UserDefined<T extends Comparable<T>, U extends UserDefinedPredicate<T>> implements FilterPredicate, Serializable {
344+
protected final Column<T> column;
345+
346+
UserDefined(Column<T> column) {
347+
this.column = checkNotNull(column, "column");
348+
}
349+
350+
public Column<T> getColumn() {
351+
return column;
352+
}
353+
354+
public abstract U getUserDefinedPredicate();
355+
356+
@Override
357+
public <R> R accept(Visitor<R> visitor) {
358+
return visitor.visit(this);
359+
}
360+
}
361+
362+
public static final class UserDefinedByClass<T extends Comparable<T>, U extends UserDefinedPredicate<T>> extends UserDefined<T, U> {
345363
private final Class<U> udpClass;
346364
private final String toString;
347365
private static final String INSTANTIATION_ERROR_MESSAGE =
348366
"Could not instantiate custom filter: %s. User defined predicates must be static classes with a default constructor.";
349367

350-
UserDefined(Column<T> column, Class<U> udpClass) {
351-
this.column = checkNotNull(column, "column");
368+
UserDefinedByClass(Column<T> column, Class<U> udpClass) {
369+
super(column);
352370
this.udpClass = checkNotNull(udpClass, "udpClass");
353371
String name = getClass().getSimpleName().toLowerCase();
354372
this.toString = name + "(" + column.getColumnPath().toDotString() + ", " + udpClass.getName() + ")";
@@ -357,14 +375,11 @@ public static final class UserDefined<T extends Comparable<T>, U extends UserDef
357375
getUserDefinedPredicate();
358376
}
359377

360-
public Column<T> getColumn() {
361-
return column;
362-
}
363-
364378
public Class<U> getUserDefinedPredicateClass() {
365379
return udpClass;
366380
}
367381

382+
@Override
368383
public U getUserDefinedPredicate() {
369384
try {
370385
return udpClass.newInstance();
@@ -375,11 +390,6 @@ public U getUserDefinedPredicate() {
375390
}
376391
}
377392

378-
@Override
379-
public <R> R accept(Visitor<R> visitor) {
380-
return visitor.visit(this);
381-
}
382-
383393
@Override
384394
public String toString() {
385395
return toString;
@@ -390,7 +400,7 @@ public boolean equals(Object o) {
390400
if (this == o) return true;
391401
if (o == null || getClass() != o.getClass()) return false;
392402

393-
UserDefined that = (UserDefined) o;
403+
UserDefinedByClass that = (UserDefinedByClass) o;
394404

395405
if (!column.equals(that.column)) return false;
396406
if (!udpClass.equals(that.udpClass)) return false;
@@ -406,30 +416,21 @@ public int hashCode() {
406416
return result;
407417
}
408418
}
409-
410-
public static final class ConfiguredUserDefined<T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable > implements FilterPredicate {
411-
private final Column<T> column;
412-
private final U udp;
419+
420+
public static final class UserDefinedByInstance<T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> extends UserDefined<T, U> {
413421
private final String toString;
422+
private final U udpInstance;
414423

415-
ConfiguredUserDefined(Column<T> column, U udp) {
416-
this.column = checkNotNull(column, "column");
417-
this.udp = checkNotNull(udp, "udp");
424+
UserDefinedByInstance(Column<T> column, U udpInstance) {
425+
super(column);
426+
this.udpInstance = checkNotNull(udpInstance, "udpInstance");
418427
String name = getClass().getSimpleName().toLowerCase();
419-
this.toString = name + "(" + column.getColumnPath().toDotString() + ", " + udp.getClass().getName() + ")";
420-
}
421-
422-
public Column<T> getColumn() {
423-
return column;
424-
}
425-
426-
public U getUserDefinedPredicate() {
427-
return udp;
428+
this.toString = name + "(" + column.getColumnPath().toDotString() + ", " + udpInstance + ")";
428429
}
429430

430431
@Override
431-
public <R> R accept(Visitor<R> visitor) {
432-
return visitor.visit(this);
432+
public U getUserDefinedPredicate() {
433+
return udpInstance;
433434
}
434435

435436
@Override
@@ -442,18 +443,18 @@ public boolean equals(Object o) {
442443
if (this == o) return true;
443444
if (o == null || getClass() != o.getClass()) return false;
444445

445-
ConfiguredUserDefined that = (ConfiguredUserDefined) o;
446+
UserDefinedByInstance that = (UserDefinedByInstance) o;
446447

447448
if (!column.equals(that.column)) return false;
448-
if (!udp.equals(that.udp)) return false;
449+
if (!udpInstance.equals(that.udpInstance)) return false;
449450

450451
return true;
451452
}
452453

453454
@Override
454455
public int hashCode() {
455456
int result = column.hashCode();
456-
result = 31 * result + udp.hashCode();
457+
result = 31 * result + udpInstance.hashCode();
457458
result = result * 31 + getClass().hashCode();
458459
return result;
459460
}
@@ -504,48 +505,4 @@ public int hashCode() {
504505
}
505506
}
506507

507-
// Represents the inverse of a ConfiguredUserDefined. It is equivalent to not(userDefined), without the use
508-
// of the not() operator
509-
public static final class LogicalNotConfiguredUserDefined <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable > implements FilterPredicate, Serializable {
510-
private final ConfiguredUserDefined<T, U> udp;
511-
private final String toString;
512-
513-
LogicalNotConfiguredUserDefined(ConfiguredUserDefined<T, U> configuredUserDefined) {
514-
this.udp = checkNotNull(configuredUserDefined, "configuredUserDefined");
515-
this.toString = "inverted(" + udp + ")";
516-
}
517-
518-
public ConfiguredUserDefined<T, U> getUserDefined() {
519-
return udp;
520-
}
521-
522-
@Override
523-
public <R> R accept(Visitor<R> visitor) {
524-
return visitor.visit(this);
525-
}
526-
527-
@Override
528-
public String toString() {
529-
return toString;
530-
}
531-
532-
@Override
533-
public boolean equals(Object o) {
534-
if (this == o) return true;
535-
if (o == null || getClass() != o.getClass()) return false;
536-
537-
LogicalNotUserDefined that = (LogicalNotUserDefined) o;
538-
539-
if (!udp.equals(that.udp)) return false;
540-
541-
return true;
542-
}
543-
544-
@Override
545-
public int hashCode() {
546-
int result = udp.hashCode();
547-
result = result * 31 + getClass().hashCode();
548-
return result;
549-
}
550-
}
551508
}

parquet-column/src/main/java/parquet/filter2/predicate/SchemaCompatibilityValidator.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package parquet.filter2.predicate;
22

3-
import java.io.Serializable;
43
import java.util.HashMap;
54
import java.util.Map;
65

@@ -13,14 +12,12 @@
1312
import parquet.filter2.predicate.Operators.Gt;
1413
import parquet.filter2.predicate.Operators.GtEq;
1514
import parquet.filter2.predicate.Operators.LogicalNotUserDefined;
16-
import parquet.filter2.predicate.Operators.LogicalNotConfiguredUserDefined;
1715
import parquet.filter2.predicate.Operators.Lt;
1816
import parquet.filter2.predicate.Operators.LtEq;
1917
import parquet.filter2.predicate.Operators.Not;
2018
import parquet.filter2.predicate.Operators.NotEq;
2119
import parquet.filter2.predicate.Operators.Or;
2220
import parquet.filter2.predicate.Operators.UserDefined;
23-
import parquet.filter2.predicate.Operators.ConfiguredUserDefined;
2421
import parquet.schema.MessageType;
2522
import parquet.schema.OriginalType;
2623

@@ -136,22 +133,11 @@ public <T extends Comparable<T>, U extends UserDefinedPredicate<T>> Void visit(U
136133
return null;
137134
}
138135

139-
@Override
140-
public <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> Void visit(ConfiguredUserDefined<T, U> udp) {
141-
validateColumn(udp.getColumn());
142-
return null;
143-
}
144-
145136
@Override
146137
public <T extends Comparable<T>, U extends UserDefinedPredicate<T>> Void visit(LogicalNotUserDefined<T, U> udp) {
147138
return udp.getUserDefined().accept(this);
148139
}
149140

150-
@Override
151-
public <T extends Comparable<T>, U extends UserDefinedPredicate<T> & Serializable> Void visit(LogicalNotConfiguredUserDefined<T, U> udp) {
152-
return udp.getUserDefined().accept(this);
153-
}
154-
155141
private <T extends Comparable<T>> void validateColumnFilterPredicate(ColumnFilterPredicate<T> pred) {
156142
validateColumn(pred.getColumn());
157143
}

0 commit comments

Comments
 (0)