Skip to content

Commit 57edfde

Browse files
authoredSep 22, 2020
fix: Filters should be serializable (#397)
* fix: Filters should be serializable * rollback changes to generated files * customize serialization of builders * customize serialization of builders * customize serialization of builders * check serialization of non-filter instances * test for spawned filters
1 parent 41c3754 commit 57edfde

File tree

2 files changed

+293
-14
lines changed
  • google-cloud-bigtable/src

2 files changed

+293
-14
lines changed
 

‎google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java

+73-14
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import com.google.cloud.bigtable.data.v2.models.Range.AbstractTimestampRange;
2626
import com.google.common.base.Preconditions;
2727
import com.google.protobuf.ByteString;
28+
import java.io.IOException;
29+
import java.io.ObjectInputStream;
30+
import java.io.ObjectOutputStream;
2831
import java.io.Serializable;
2932
import javax.annotation.Nonnull;
3033

@@ -200,7 +203,19 @@ public Filter label(@Nonnull String label) {
200203
// Implementations of target specific filters.
201204
/** DSL for adding filters to a chain. */
202205
public static final class ChainFilter implements Filter {
203-
private RowFilter.Chain.Builder builder;
206+
private static final long serialVersionUID = -6756759448656768478L;
207+
private transient RowFilter.Chain.Builder builder;
208+
209+
private void writeObject(ObjectOutputStream s) throws IOException {
210+
s.defaultWriteObject();
211+
s.writeObject(builder.build());
212+
}
213+
214+
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
215+
s.defaultReadObject();
216+
RowFilter.Chain chain = (RowFilter.Chain) s.readObject();
217+
this.builder = chain.toBuilder();
218+
}
204219

205220
private ChainFilter() {
206221
this.builder = RowFilter.Chain.newBuilder();
@@ -241,7 +256,19 @@ public ChainFilter clone() {
241256

242257
/** DSL for adding filters to the interleave list. */
243258
public static final class InterleaveFilter implements Filter {
244-
private RowFilter.Interleave.Builder builder;
259+
private static final long serialVersionUID = -6356151037337889421L;
260+
private transient RowFilter.Interleave.Builder builder;
261+
262+
private void writeObject(ObjectOutputStream s) throws IOException {
263+
s.defaultWriteObject();
264+
s.writeObject(builder.build());
265+
}
266+
267+
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
268+
s.defaultReadObject();
269+
RowFilter.Interleave interleave = (RowFilter.Interleave) s.readObject();
270+
this.builder = interleave.toBuilder();
271+
}
245272

246273
private InterleaveFilter() {
247274
builder = RowFilter.Interleave.newBuilder();
@@ -281,7 +308,19 @@ public InterleaveFilter clone() {
281308

282309
/** DSL for configuring a conditional filter. */
283310
public static final class ConditionFilter implements Filter {
284-
private RowFilter.Condition.Builder builder;
311+
private static final long serialVersionUID = -2720899822014446776L;
312+
private transient RowFilter.Condition.Builder builder;
313+
314+
private void writeObject(ObjectOutputStream s) throws IOException {
315+
s.defaultWriteObject();
316+
s.writeObject(builder.build());
317+
}
318+
319+
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
320+
s.defaultReadObject();
321+
RowFilter.Condition condition = (RowFilter.Condition) s.readObject();
322+
this.builder = condition.toBuilder();
323+
}
285324

286325
private ConditionFilter(@Nonnull Filter predicate) {
287326
Preconditions.checkNotNull(predicate);
@@ -323,7 +362,9 @@ public ConditionFilter clone() {
323362
}
324363
}
325364

326-
public static final class KeyFilter {
365+
public static final class KeyFilter implements Serializable {
366+
private static final long serialVersionUID = 5137765114285539458L;
367+
327368
private KeyFilter() {}
328369

329370
/**
@@ -383,7 +424,9 @@ public Filter sample(double probability) {
383424
}
384425
}
385426

386-
public static final class FamilyFilter {
427+
public static final class FamilyFilter implements Serializable {
428+
private static final long serialVersionUID = -4470936841191831553L;
429+
387430
private FamilyFilter() {}
388431

389432
/**
@@ -405,7 +448,9 @@ public Filter exactMatch(@Nonnull String value) {
405448
}
406449
}
407450

408-
public static final class QualifierFilter {
451+
public static final class QualifierFilter implements Serializable {
452+
private static final long serialVersionUID = -1274850022909506559L;
453+
409454
private QualifierFilter() {}
410455

411456
/**
@@ -459,7 +504,8 @@ public QualifierRangeFilter rangeWithinFamily(@Nonnull String family) {
459504

460505
/** Matches only cells from columns within the given range. */
461506
public static final class QualifierRangeFilter
462-
extends AbstractByteStringRange<QualifierRangeFilter> implements Filter, Serializable {
507+
extends AbstractByteStringRange<QualifierRangeFilter> implements Filter {
508+
private static final long serialVersionUID = -1909319911147913630L;
463509
private final String family;
464510

465511
private QualifierRangeFilter(String family) {
@@ -505,7 +551,9 @@ public QualifierRangeFilter clone() {
505551
}
506552
}
507553

508-
public static final class TimestampFilter {
554+
public static final class TimestampFilter implements Serializable {
555+
private static final long serialVersionUID = 5284219722591464991L;
556+
509557
private TimestampFilter() {}
510558

511559
/**
@@ -529,7 +577,9 @@ public TimestampRangeFilter exact(Long exactTimestamp) {
529577

530578
/** Matches only cells with microsecond timestamps within the given range. */
531579
public static final class TimestampRangeFilter
532-
extends AbstractTimestampRange<TimestampRangeFilter> implements Filter, Serializable {
580+
extends AbstractTimestampRange<TimestampRangeFilter> implements Filter {
581+
private static final long serialVersionUID = 8410980338603335276L;
582+
533583
private TimestampRangeFilter() {}
534584

535585
@InternalApi
@@ -571,7 +621,9 @@ public TimestampRangeFilter clone() {
571621
}
572622
}
573623

574-
public static final class ValueFilter {
624+
public static final class ValueFilter implements Serializable {
625+
private static final long serialVersionUID = 6722715229238811179L;
626+
575627
private ValueFilter() {}
576628

577629
/**
@@ -628,7 +680,9 @@ public Filter strip() {
628680

629681
/** Matches only cells with values that fall within the given value range. */
630682
public static final class ValueRangeFilter extends AbstractByteStringRange<ValueRangeFilter>
631-
implements Filter, Serializable {
683+
implements Filter {
684+
private static final long serialVersionUID = -2452360677825047088L;
685+
632686
private ValueRangeFilter() {}
633687

634688
@InternalApi
@@ -668,7 +722,9 @@ public ValueRangeFilter clone() {
668722
}
669723
}
670724

671-
public static final class OffsetFilter {
725+
public static final class OffsetFilter implements Serializable {
726+
private static final long serialVersionUID = 3228791236971884041L;
727+
672728
private OffsetFilter() {}
673729

674730
/**
@@ -681,7 +737,9 @@ public Filter cellsPerRow(int count) {
681737
}
682738
}
683739

684-
public static final class LimitFilter {
740+
public static final class LimitFilter implements Serializable {
741+
private static final long serialVersionUID = -794915549003008940L;
742+
685743
private LimitFilter() {}
686744

687745
/**
@@ -705,6 +763,7 @@ public Filter cellsPerColumn(int count) {
705763
}
706764

707765
private static final class SimpleFilter implements Filter {
766+
private static final long serialVersionUID = 3595911451325189833L;
708767
private final RowFilter proto;
709768

710769
private SimpleFilter(@Nonnull RowFilter proto) {
@@ -729,7 +788,7 @@ public SimpleFilter clone() {
729788
}
730789

731790
@InternalExtensionOnly
732-
public interface Filter extends Cloneable {
791+
public interface Filter extends Cloneable, Serializable {
733792
@InternalApi
734793
RowFilter toProto();
735794
}

0 commit comments

Comments
 (0)