From a851c38eb8e906499299426c2f6ea0cde65db596 Mon Sep 17 00:00:00 2001 From: Tom Andersen Date: Mon, 4 Nov 2024 17:01:06 -0500 Subject: [PATCH 1/3] Refactor pipelines --- .../pipeline/stages/AbstractStage.java | 3 +- .../firestore/pipeline/stages/AddFields.java | 10 +- .../firestore/pipeline/stages/Aggregate.java | 14 ++- .../firestore/pipeline/stages/Collection.java | 12 +- .../pipeline/stages/CollectionGroup.java | 15 ++- .../firestore/pipeline/stages/Database.java | 8 +- .../firestore/pipeline/stages/Distinct.java | 10 +- .../firestore/pipeline/stages/Documents.java | 12 +- .../pipeline/stages/FindNearest.java | 17 ++- .../pipeline/stages/GenericStage.java | 14 ++- .../firestore/pipeline/stages/Limit.java | 12 +- .../firestore/pipeline/stages/Offset.java | 10 +- .../pipeline/stages/RemoveFields.java | 13 +- .../firestore/pipeline/stages/Replace.java | 15 +-- .../firestore/pipeline/stages/Sample.java | 6 +- .../pipeline/stages/SampleOptions.java | 12 +- .../firestore/pipeline/stages/Select.java | 10 +- .../cloud/firestore/pipeline/stages/Sort.java | 12 +- .../firestore/pipeline/stages/StageUtils.java | 116 +----------------- .../firestore/pipeline/stages/Union.java | 10 +- .../firestore/pipeline/stages/Unnest.java | 13 +- .../firestore/pipeline/stages/Where.java | 10 +- 22 files changed, 189 insertions(+), 165 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java index 0d46ab7e2..13f1ec795 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java @@ -16,7 +16,6 @@ package com.google.cloud.firestore.pipeline.stages; -import com.google.firestore.v1.Value; /** * Parent to all stages. @@ -26,5 +25,5 @@ * based on type. This should eliminate `instanceof` usage with respect to `Stage` implementations. */ abstract class AbstractStage implements Stage { - abstract Value getProtoArgs(); + abstract com.google.firestore.v1.Pipeline.Stage toStageProto(); } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java index d304f910d..ade820538 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java @@ -16,12 +16,15 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Expr; +import com.google.firestore.v1.Pipeline; import java.util.Map; @InternalApi -public final class AddFields implements Stage { +public final class AddFields extends AbstractStage { private static final String name = "add_fields"; private final Map fields; @@ -40,4 +43,9 @@ public Map getFields() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(fields)).build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java index 208370068..2883adf43 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java @@ -16,6 +16,8 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.cloud.firestore.PipelineUtils; @@ -23,13 +25,14 @@ import com.google.cloud.firestore.pipeline.expressions.Expr; import com.google.cloud.firestore.pipeline.expressions.ExprWithAlias; import com.google.cloud.firestore.pipeline.expressions.Selectable; +import com.google.firestore.v1.Pipeline; import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.stream.Collectors; @BetaApi -public final class Aggregate implements Stage { +public final class Aggregate extends AbstractStage { private static final String name = "aggregate"; private final Map groups; @@ -77,4 +80,13 @@ Map getAccumulators() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder() + .setName(name) + .addArgs(encodeValue(accumulators)) + .addArgs(encodeValue(groups)) + .build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java index 5e552b051..58c791a4c 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java @@ -17,10 +17,12 @@ package com.google.cloud.firestore.pipeline.stages; import com.google.api.core.InternalApi; +import com.google.firestore.v1.Pipeline; +import com.google.firestore.v1.Value; import javax.annotation.Nonnull; @InternalApi -public final class Collection implements Stage { +public final class Collection extends AbstractStage { private static final String name = "collection"; @Nonnull private final String path; @@ -43,4 +45,12 @@ public String getPath() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder() + .setName(name) + .addArgs(Value.newBuilder().setReferenceValue(path).build()) + .build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java index 148ecdd7f..3b1820562 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java @@ -16,10 +16,14 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; +import com.google.firestore.v1.Pipeline; +import com.google.firestore.v1.Value; @InternalApi -public final class CollectionGroup implements Stage { +public final class CollectionGroup extends AbstractStage { private static final String name = "collection_group"; private final String collectionId; @@ -38,4 +42,13 @@ public String getCollectionId() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder() + .setName(name) + .addArgs(Value.newBuilder().setReferenceValue("").build()) + .addArgs(encodeValue(collectionId)) + .build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java index 42a52b721..4eec5459c 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java @@ -17,9 +17,10 @@ package com.google.cloud.firestore.pipeline.stages; import com.google.api.core.InternalApi; +import com.google.firestore.v1.Pipeline; @InternalApi -public final class Database implements Stage { +public final class Database extends AbstractStage { private static final String name = "database"; @InternalApi @@ -29,4 +30,9 @@ public Database() {} public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java index 018301465..8af8435e0 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java @@ -16,13 +16,16 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Expr; +import com.google.firestore.v1.Pipeline; import java.util.Map; @BetaApi -public final class Distinct implements Stage { +public final class Distinct extends AbstractStage { private static final String name = "distinct"; private final Map groups; @@ -41,4 +44,9 @@ Map getGroups() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(groups)).build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java index ed8d8bc1d..986ef5b17 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java @@ -18,12 +18,13 @@ import com.google.api.core.InternalApi; import com.google.cloud.firestore.DocumentReference; +import com.google.firestore.v1.Pipeline; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @InternalApi -public final class Documents implements Stage { +public final class Documents extends AbstractStage { private static final String name = "documents"; private List documents; @@ -48,4 +49,13 @@ public List getDocuments() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); + for (String document : documents) { + builder.addArgsBuilder().setStringValue(document); + } + return builder.build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java index 44f5bf2e7..9e7614adb 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java @@ -16,12 +16,15 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Expr; +import com.google.firestore.v1.Pipeline; @BetaApi -public final class FindNearest implements Stage { +public final class FindNearest extends AbstractStage { public interface DistanceMeasure { @@ -133,4 +136,16 @@ public DistanceMeasure getDistanceMeasure() { public FindNearestOptions getOptions() { return options; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder() + .setName(name) + .addArgs(encodeValue(property)) + .addArgs(encodeValue(vector)) + .addArgs(encodeValue(distanceMeasure.toProtoString())) + .putOptions("limit", encodeValue(options.getLimit())) + .putOptions("distance_field", encodeValue(options.getDistanceField())) + .build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java index 4e694c9a1..cf7561499 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java @@ -16,11 +16,14 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; +import com.google.firestore.v1.Pipeline; import java.util.List; @InternalApi -public final class GenericStage implements Stage { +public final class GenericStage extends AbstractStage { private final String name; private List params; @@ -41,4 +44,13 @@ public String getName() { public List getParams() { return params; } + + @Override + Pipeline.Stage toStageProto() { + Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); + for (Object param : params) { + builder.addArgs(encodeValue(param)); + } + return builder.build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java index e6a92eb61..371be9ff1 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java @@ -16,13 +16,16 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; +import com.google.firestore.v1.Pipeline; @InternalApi -public final class Limit implements Stage { +public final class Limit extends AbstractStage { private static final String name = "limit"; - private int limit; + private final int limit; @InternalApi public Limit(int limit) { @@ -39,4 +42,9 @@ public int getLimit() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(limit)).build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java index 41509ff31..e7106b47a 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java @@ -16,10 +16,13 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; +import com.google.firestore.v1.Pipeline; @InternalApi -public final class Offset implements Stage { +public final class Offset extends AbstractStage { private static final String name = "offset"; private final int offset; @@ -39,4 +42,9 @@ public int getOffset() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(offset)).build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java index f93c6d10d..7cbbeeb84 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java @@ -17,11 +17,13 @@ package com.google.cloud.firestore.pipeline.stages; import com.google.api.core.InternalApi; +import com.google.cloud.firestore.PipelineUtils; import com.google.cloud.firestore.pipeline.expressions.Field; import com.google.common.collect.ImmutableList; +import com.google.firestore.v1.Pipeline; @InternalApi -public final class RemoveFields implements Stage { +public final class RemoveFields extends AbstractStage { private static final String name = "remove_fields"; private final ImmutableList fields; @@ -40,4 +42,13 @@ public ImmutableList getFields() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); + for (Field field : fields) { + builder.addArgs(PipelineUtils.encodeValue(field)); + } + return builder.build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java index 3d9ab9cfc..ca8d21a7e 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java @@ -20,13 +20,13 @@ import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Selectable; -import com.google.firestore.v1.MapValue; +import com.google.firestore.v1.Pipeline; import com.google.firestore.v1.Value; import javax.annotation.Nonnull; public class Replace extends AbstractStage { - private static final String name = "unnest"; + private static final String name = "replace"; private final Selectable field; private final Mode mode; @@ -57,10 +57,11 @@ public String getName() { } @Override - Value getProtoArgs() { - MapValue.Builder builder = MapValue.newBuilder(); - builder.putFields("map", encodeValue(field)); - builder.putFields("mode", mode.value); - return Value.newBuilder().setMapValue(builder).build(); + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder() + .setName(name) + .addArgs(encodeValue(field)) + .addArgs(mode.value) + .build(); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java index 739badcb1..5f190cad9 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java @@ -17,7 +17,7 @@ package com.google.cloud.firestore.pipeline.stages; import com.google.api.core.InternalApi; -import com.google.firestore.v1.Value; +import com.google.firestore.v1.Pipeline; public final class Sample extends AbstractStage { @@ -40,7 +40,7 @@ public SampleOptions getOptions() { } @Override - Value getProtoArgs() { - return options.getProtoArgs(); + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addAllArgs(options.getProtoArgs()).build(); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/SampleOptions.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/SampleOptions.java index 607675c83..c22e81479 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/SampleOptions.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/SampleOptions.java @@ -18,7 +18,7 @@ import static com.google.cloud.firestore.PipelineUtils.encodeValue; -import com.google.firestore.v1.MapValue; +import com.google.common.collect.ImmutableList; import com.google.firestore.v1.Value; public class SampleOptions { @@ -50,13 +50,7 @@ public static SampleOptions docLimit(int limit) { return new SampleOptions(limit, Mode.DOCUMENTS); } - Value getProtoArgs() { - return Value.newBuilder() - .setMapValue( - MapValue.newBuilder() - .putFields("n", encodeValue(n)) - .putFields("mode", mode.value) - .build()) - .build(); + Iterable getProtoArgs() { + return ImmutableList.of(encodeValue(n), mode.value); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java index a1dfec9d8..6b42ee994 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java @@ -16,12 +16,15 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Expr; +import com.google.firestore.v1.Pipeline; import java.util.Map; @InternalApi -public final class Select implements Stage { +public final class Select extends AbstractStage { private static final String name = "select"; private final Map projections; @@ -41,4 +44,9 @@ public Map getProjections() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(projections)).build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java index c054bcc25..404ea3141 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java @@ -19,9 +19,10 @@ import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Ordering; import com.google.common.collect.Lists; +import com.google.firestore.v1.Pipeline; import java.util.List; -public final class Sort implements Stage { +public final class Sort extends AbstractStage { private static final String name = "sort"; private final List orders; @@ -40,4 +41,13 @@ public String getName() { public List getOrders() { return orders; } + + @Override + Pipeline.Stage toStageProto() { + Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); + for (Ordering order : orders) { + builder.addArgs(order.toProto()); + } + return builder.build(); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java index e65eacb6c..10403d86b 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java @@ -16,13 +16,8 @@ package com.google.cloud.firestore.pipeline.stages; -import static com.google.cloud.firestore.PipelineUtils.encodeValue; import com.google.api.core.InternalApi; -import com.google.cloud.firestore.PipelineUtils; -import com.google.cloud.firestore.pipeline.expressions.Ordering; -import com.google.firestore.v1.Value; -import java.util.stream.Collectors; @InternalApi public final class StageUtils { @@ -31,116 +26,7 @@ public static com.google.firestore.v1.Pipeline.Stage toStageProto(Stage stage) { if (stage instanceof AbstractStage) { AbstractStage abstractStage = (AbstractStage) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(abstractStage.getName()) - .addArgs(abstractStage.getProtoArgs()) - .build(); - } else if (stage instanceof Collection) { - Collection collectionStage = (Collection) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(collectionStage.getName()) - .addArgs(Value.newBuilder().setReferenceValue(collectionStage.getPath()).build()) - .build(); - } else if (stage instanceof CollectionGroup) { - CollectionGroup collectionGroupStage = (CollectionGroup) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(collectionGroupStage.getName()) - .addArgs(Value.newBuilder().setReferenceValue("").build()) - .addArgs(encodeValue(collectionGroupStage.getCollectionId())) - .build(); - } else if (stage instanceof Database) { - Database databaseStage = (Database) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(databaseStage.getName()) - .build(); - } else if (stage instanceof Documents) { - Documents documentsStage = (Documents) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(documentsStage.getName()) - .addAllArgs( - documentsStage.getDocuments().stream() - .map(doc -> Value.newBuilder().setReferenceValue(doc).build()) - .collect(Collectors.toList())) - .build(); - } else if (stage instanceof Select) { - Select selectStage = (Select) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(selectStage.getName()) - .addArgs(encodeValue(selectStage.getProjections())) - .build(); - } else if (stage instanceof AddFields) { - AddFields addFieldsStage = (AddFields) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(addFieldsStage.getName()) - .addArgs(encodeValue(addFieldsStage.getFields())) - .build(); - } else if (stage instanceof RemoveFields) { - RemoveFields removeFieldsStage = (RemoveFields) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(removeFieldsStage.getName()) - .addAllArgs( - removeFieldsStage.getFields().stream() - .map(f -> encodeValue(f)) - .collect(Collectors.toList())) - .build(); - } else if (stage instanceof Where) { - Where whereStage = (Where) stage; // Use wildcard for generic type - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(whereStage.getName()) - .addArgs(encodeValue(whereStage.getCondition())) - .build(); - } else if (stage instanceof Sort) { - Sort sortStage = (Sort) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(sortStage.getName()) - .addAllArgs( - sortStage.getOrders().stream().map(Ordering::toProto).collect(Collectors.toList())) - .build(); - } else if (stage instanceof Offset) { - Offset offsetStage = (Offset) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(offsetStage.getName()) - .addArgs(encodeValue(offsetStage.getOffset())) - .build(); - } else if (stage instanceof Limit) { - Limit limitStage = (Limit) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(limitStage.getName()) - .addArgs(encodeValue(limitStage.getLimit())) - .build(); - } else if (stage instanceof Aggregate) { - Aggregate aggregateStage = (Aggregate) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(aggregateStage.getName()) - .addArgs(encodeValue(aggregateStage.getAccumulators())) - .addArgs(encodeValue(aggregateStage.getGroups())) - .build(); - } else if (stage instanceof Distinct) { - Distinct distinctStage = (Distinct) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(distinctStage.getName()) - .addArgs(encodeValue(distinctStage.getGroups())) - .build(); - } else if (stage instanceof FindNearest) { - FindNearest findNearestStage = (FindNearest) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(findNearestStage.getName()) - .addArgs(encodeValue(findNearestStage.getProperty())) - .addArgs(encodeValue(findNearestStage.getVector())) - .addArgs(encodeValue(findNearestStage.getDistanceMeasure().toProtoString())) - .putOptions("limit", encodeValue(findNearestStage.getOptions().getLimit())) - .putOptions( - "distance_field", encodeValue(findNearestStage.getOptions().getDistanceField())) - .build(); - } else if (stage instanceof GenericStage) { - GenericStage genericStage = (GenericStage) stage; - return com.google.firestore.v1.Pipeline.Stage.newBuilder() - .setName(genericStage.getName()) - .addAllArgs( - genericStage.getParams().stream() - .map(PipelineUtils::encodeValue) - .collect(Collectors.toList())) - .build(); + return ((AbstractStage) stage).toStageProto(); } else { // Handle the else case appropriately (e.g., throw an exception) throw new IllegalArgumentException("Unknown stage type: " + stage.getClass()); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java index 4eb25da6f..dae095389 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java @@ -18,8 +18,7 @@ import com.google.api.core.InternalApi; import com.google.cloud.firestore.Pipeline; -import com.google.firestore.v1.MapValue; -import com.google.firestore.v1.Value; +import com.google.firestore.v1.Pipeline.Stage; public class Union extends AbstractStage { @@ -36,9 +35,8 @@ public String getName() { } @Override - Value getProtoArgs() { - return Value.newBuilder() - .setMapValue(MapValue.newBuilder().putFields("other", other.toProtoValue())) - .build(); + Stage toStageProto() { + Stage.Builder builder = com.google.firestore.v1.Pipeline.Stage.newBuilder().setName(name); + return builder.addArgs(other.toProtoValue()).build(); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java index 71f4e03cd..bd59d0197 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java @@ -20,8 +20,7 @@ import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Field; -import com.google.firestore.v1.MapValue; -import com.google.firestore.v1.Value; +import com.google.firestore.v1.Pipeline; import javax.annotation.Nonnull; public class Unnest extends AbstractStage { @@ -46,12 +45,12 @@ public String getName() { } @Override - Value getProtoArgs() { - MapValue.Builder builder = MapValue.newBuilder(); - builder.putFields("field", encodeValue(field)); + Pipeline.Stage toStageProto() { + Pipeline.Stage.Builder builder = + Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(field)); if (options != null) { - builder.putFields("index_field", encodeValue(options.indexField)); + builder.addArgs(encodeValue(options.indexField)); } - return Value.newBuilder().setMapValue(builder).build(); + return builder.build(); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java index 857e77f7a..092cd2334 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java @@ -16,11 +16,14 @@ package com.google.cloud.firestore.pipeline.stages; +import static com.google.cloud.firestore.PipelineUtils.encodeValue; + import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.FilterCondition; +import com.google.firestore.v1.Pipeline; @InternalApi -public final class Where implements Stage { +public final class Where extends AbstractStage { private static final String name = "where"; private final FilterCondition condition; @@ -39,4 +42,9 @@ public FilterCondition getCondition() { public String getName() { return name; } + + @Override + Pipeline.Stage toStageProto() { + return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(condition)).build(); + } } From 771fd4ac93af82076783d879e6fcca63869d16e2 Mon Sep 17 00:00:00 2001 From: Tom Andersen Date: Mon, 4 Nov 2024 17:56:20 -0500 Subject: [PATCH 2/3] Pretty --- .../google/cloud/firestore/pipeline/stages/AbstractStage.java | 1 - .../com/google/cloud/firestore/pipeline/stages/StageUtils.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java index 13f1ec795..7578d07aa 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java @@ -16,7 +16,6 @@ package com.google.cloud.firestore.pipeline.stages; - /** * Parent to all stages. * diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java index 10403d86b..20efef816 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java @@ -16,16 +16,13 @@ package com.google.cloud.firestore.pipeline.stages; - import com.google.api.core.InternalApi; @InternalApi public final class StageUtils { @InternalApi public static com.google.firestore.v1.Pipeline.Stage toStageProto(Stage stage) { - if (stage instanceof AbstractStage) { - AbstractStage abstractStage = (AbstractStage) stage; return ((AbstractStage) stage).toStageProto(); } else { // Handle the else case appropriately (e.g., throw an exception) From a87889d22de4839162dbbf3d050a6b88c4786887 Mon Sep 17 00:00:00 2001 From: Tom Andersen Date: Tue, 5 Nov 2024 11:34:31 -0500 Subject: [PATCH 3/3] Simplify --- .../pipeline/stages/AbstractStage.java | 28 ------------------- .../firestore/pipeline/stages/AddFields.java | 12 +------- .../firestore/pipeline/stages/Aggregate.java | 18 +----------- .../firestore/pipeline/stages/Collection.java | 12 +------- .../pipeline/stages/CollectionGroup.java | 12 +------- .../firestore/pipeline/stages/Database.java | 7 +---- .../firestore/pipeline/stages/Distinct.java | 12 +------- .../firestore/pipeline/stages/Documents.java | 12 +------- .../pipeline/stages/FindNearest.java | 28 +------------------ .../pipeline/stages/GenericStage.java | 13 +-------- .../firestore/pipeline/stages/Limit.java | 13 +-------- .../firestore/pipeline/stages/Offset.java | 13 +-------- .../pipeline/stages/RemoveFields.java | 12 +------- .../firestore/pipeline/stages/Replace.java | 8 +----- .../firestore/pipeline/stages/Sample.java | 12 +------- .../firestore/pipeline/stages/Select.java | 13 +-------- .../cloud/firestore/pipeline/stages/Sort.java | 12 +------- .../firestore/pipeline/stages/Stage.java | 9 ++++-- .../firestore/pipeline/stages/StageUtils.java | 7 +---- .../firestore/pipeline/stages/Union.java | 14 +++------- .../firestore/pipeline/stages/Unnest.java | 8 +----- .../firestore/pipeline/stages/Where.java | 12 +------- 22 files changed, 30 insertions(+), 257 deletions(-) delete mode 100644 google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java deleted file mode 100644 index 7578d07aa..000000000 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AbstractStage.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2024 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.firestore.pipeline.stages; - -/** - * Parent to all stages. - * - *

This class is package private to prevent public access to these methods. Methods in this class - * support internal polymorphic processing, that would otherwise require conditional processing - * based on type. This should eliminate `instanceof` usage with respect to `Stage` implementations. - */ -abstract class AbstractStage implements Stage { - abstract com.google.firestore.v1.Pipeline.Stage toStageProto(); -} diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java index ade820538..bec9411bd 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/AddFields.java @@ -24,7 +24,7 @@ import java.util.Map; @InternalApi -public final class AddFields extends AbstractStage { +public final class AddFields extends Stage { private static final String name = "add_fields"; private final Map fields; @@ -34,16 +34,6 @@ public AddFields(Map fields) { this.fields = fields; } - @InternalApi - public Map getFields() { - return fields; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(fields)).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java index 2883adf43..520c274b2 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Aggregate.java @@ -19,7 +19,6 @@ import static com.google.cloud.firestore.PipelineUtils.encodeValue; import com.google.api.core.BetaApi; -import com.google.api.core.InternalApi; import com.google.cloud.firestore.PipelineUtils; import com.google.cloud.firestore.pipeline.expressions.Accumulator; import com.google.cloud.firestore.pipeline.expressions.Expr; @@ -32,7 +31,7 @@ import java.util.stream.Collectors; @BetaApi -public final class Aggregate extends AbstractStage { +public final class Aggregate extends Stage { private static final String name = "aggregate"; private final Map groups; @@ -66,21 +65,6 @@ private Aggregate(Map groups, Map accumulator this.accumulators = accumulators; } - @InternalApi - Map getGroups() { - return groups; - } - - @InternalApi - Map getAccumulators() { - return accumulators; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder() diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java index 58c791a4c..1dbcfd028 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Collection.java @@ -22,7 +22,7 @@ import javax.annotation.Nonnull; @InternalApi -public final class Collection extends AbstractStage { +public final class Collection extends Stage { private static final String name = "collection"; @Nonnull private final String path; @@ -36,16 +36,6 @@ public Collection(@Nonnull String path) { } } - @InternalApi - public String getPath() { - return path; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder() diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java index 3b1820562..186b06c09 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/CollectionGroup.java @@ -23,7 +23,7 @@ import com.google.firestore.v1.Value; @InternalApi -public final class CollectionGroup extends AbstractStage { +public final class CollectionGroup extends Stage { private static final String name = "collection_group"; private final String collectionId; @@ -33,16 +33,6 @@ public CollectionGroup(String collectionId) { this.collectionId = collectionId; } - @InternalApi - public String getCollectionId() { - return collectionId; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder() diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java index 4eec5459c..8fd98ca03 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Database.java @@ -20,17 +20,12 @@ import com.google.firestore.v1.Pipeline; @InternalApi -public final class Database extends AbstractStage { +public final class Database extends Stage { private static final String name = "database"; @InternalApi public Database() {} - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java index 8af8435e0..eafbdce68 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Distinct.java @@ -25,7 +25,7 @@ import java.util.Map; @BetaApi -public final class Distinct extends AbstractStage { +public final class Distinct extends Stage { private static final String name = "distinct"; private final Map groups; @@ -35,16 +35,6 @@ public Distinct(Map groups) { this.groups = groups; } - @InternalApi - Map getGroups() { - return groups; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(groups)).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java index 986ef5b17..f20d79898 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Documents.java @@ -24,7 +24,7 @@ import java.util.stream.Collectors; @InternalApi -public final class Documents extends AbstractStage { +public final class Documents extends Stage { private static final String name = "documents"; private List documents; @@ -40,16 +40,6 @@ public static Documents of(DocumentReference... documents) { Arrays.stream(documents).map(doc -> "/" + doc.getPath()).collect(Collectors.toList())); } - @InternalApi - public List getDocuments() { - return documents; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java index 9e7614adb..2b41de29b 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/FindNearest.java @@ -24,7 +24,7 @@ import com.google.firestore.v1.Pipeline; @BetaApi -public final class FindNearest extends AbstractStage { +public final class FindNearest extends Stage { public interface DistanceMeasure { @@ -111,32 +111,6 @@ public FindNearest( this.options = options; } - @Override - @InternalApi - public String getName() { - return name; - } - - @InternalApi - public Expr getProperty() { - return property; - } - - @InternalApi - public double[] getVector() { - return vector; - } - - @InternalApi - public DistanceMeasure getDistanceMeasure() { - return distanceMeasure; - } - - @InternalApi - public FindNearestOptions getOptions() { - return options; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder() diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java index cf7561499..d2595f12c 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/GenericStage.java @@ -23,7 +23,7 @@ import java.util.List; @InternalApi -public final class GenericStage extends AbstractStage { +public final class GenericStage extends Stage { private final String name; private List params; @@ -34,17 +34,6 @@ public GenericStage(String name, List params) { this.params = params; } - @Override - @InternalApi - public String getName() { - return name; - } - - @InternalApi - public List getParams() { - return params; - } - @Override Pipeline.Stage toStageProto() { Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java index 371be9ff1..5d73400ff 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Limit.java @@ -22,7 +22,7 @@ import com.google.firestore.v1.Pipeline; @InternalApi -public final class Limit extends AbstractStage { +public final class Limit extends Stage { private static final String name = "limit"; private final int limit; @@ -32,17 +32,6 @@ public Limit(int limit) { this.limit = limit; } - @InternalApi - public int getLimit() { - return limit; - } - - @Override - @InternalApi - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(limit)).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java index e7106b47a..49bb0aed4 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Offset.java @@ -22,7 +22,7 @@ import com.google.firestore.v1.Pipeline; @InternalApi -public final class Offset extends AbstractStage { +public final class Offset extends Stage { private static final String name = "offset"; private final int offset; @@ -32,17 +32,6 @@ public Offset(int offset) { this.offset = offset; } - @InternalApi - public int getOffset() { - return offset; - } - - @Override - @InternalApi - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(offset)).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java index 7cbbeeb84..794f28a8f 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/RemoveFields.java @@ -23,7 +23,7 @@ import com.google.firestore.v1.Pipeline; @InternalApi -public final class RemoveFields extends AbstractStage { +public final class RemoveFields extends Stage { private static final String name = "remove_fields"; private final ImmutableList fields; @@ -33,16 +33,6 @@ public RemoveFields(ImmutableList fields) { this.fields = fields; } - @InternalApi - public ImmutableList getFields() { - return fields; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java index ca8d21a7e..6be322564 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Replace.java @@ -18,13 +18,12 @@ import static com.google.cloud.firestore.PipelineUtils.encodeValue; -import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Selectable; import com.google.firestore.v1.Pipeline; import com.google.firestore.v1.Value; import javax.annotation.Nonnull; -public class Replace extends AbstractStage { +public class Replace extends Stage { private static final String name = "replace"; private final Selectable field; @@ -51,11 +50,6 @@ public Replace(@Nonnull Selectable field, @Nonnull Mode mode) { this.mode = mode; } - @InternalApi - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder() diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java index 5f190cad9..f30597a21 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sample.java @@ -19,7 +19,7 @@ import com.google.api.core.InternalApi; import com.google.firestore.v1.Pipeline; -public final class Sample extends AbstractStage { +public final class Sample extends Stage { private static final String name = "sample"; private final SampleOptions options; @@ -29,16 +29,6 @@ public Sample(SampleOptions options) { this.options = options; } - @InternalApi - public String getName() { - return name; - } - - @InternalApi - public SampleOptions getOptions() { - return options; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addAllArgs(options.getProtoArgs()).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java index 6b42ee994..74763f9b0 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Select.java @@ -24,7 +24,7 @@ import java.util.Map; @InternalApi -public final class Select extends AbstractStage { +public final class Select extends Stage { private static final String name = "select"; private final Map projections; @@ -34,17 +34,6 @@ public Select(Map projections) { this.projections = projections; } - @InternalApi - public Map getProjections() { - return projections; - } - - @Override - @InternalApi - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(projections)).build(); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java index 404ea3141..70d92750f 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Sort.java @@ -22,7 +22,7 @@ import com.google.firestore.v1.Pipeline; import java.util.List; -public final class Sort extends AbstractStage { +public final class Sort extends Stage { private static final String name = "sort"; private final List orders; @@ -32,16 +32,6 @@ public Sort(Ordering... orders) { this.orders = Lists.newArrayList(orders); } - @InternalApi - public String getName() { - return name; - } - - @InternalApi - public List getOrders() { - return orders; - } - @Override Pipeline.Stage toStageProto() { Pipeline.Stage.Builder builder = Pipeline.Stage.newBuilder().setName(name); diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Stage.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Stage.java index a0163478a..a148d126b 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Stage.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Stage.java @@ -16,6 +16,11 @@ package com.google.cloud.firestore.pipeline.stages; -public interface Stage { - String getName(); +/** Parent to all stages. */ +public abstract class Stage { + + /** Constructor is package-private to prevent extension. */ + Stage() {} + + abstract com.google.firestore.v1.Pipeline.Stage toStageProto(); } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java index 20efef816..d538e3dd1 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/StageUtils.java @@ -22,11 +22,6 @@ public final class StageUtils { @InternalApi public static com.google.firestore.v1.Pipeline.Stage toStageProto(Stage stage) { - if (stage instanceof AbstractStage) { - return ((AbstractStage) stage).toStageProto(); - } else { - // Handle the else case appropriately (e.g., throw an exception) - throw new IllegalArgumentException("Unknown stage type: " + stage.getClass()); - } + return stage.toStageProto(); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java index dae095389..4014e926a 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Union.java @@ -16,11 +16,9 @@ package com.google.cloud.firestore.pipeline.stages; -import com.google.api.core.InternalApi; import com.google.cloud.firestore.Pipeline; -import com.google.firestore.v1.Pipeline.Stage; -public class Union extends AbstractStage { +public class Union extends Stage { private static final String name = "union"; private final Pipeline other; @@ -29,14 +27,10 @@ public Union(Pipeline other) { this.other = other; } - @InternalApi - public String getName() { - return name; - } - @Override - Stage toStageProto() { - Stage.Builder builder = com.google.firestore.v1.Pipeline.Stage.newBuilder().setName(name); + com.google.firestore.v1.Pipeline.Stage toStageProto() { + com.google.firestore.v1.Pipeline.Stage.Builder builder = + com.google.firestore.v1.Pipeline.Stage.newBuilder().setName(name); return builder.addArgs(other.toProtoValue()).build(); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java index bd59d0197..aaddc12b2 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Unnest.java @@ -18,12 +18,11 @@ import static com.google.cloud.firestore.PipelineUtils.encodeValue; -import com.google.api.core.InternalApi; import com.google.cloud.firestore.pipeline.expressions.Field; import com.google.firestore.v1.Pipeline; import javax.annotation.Nonnull; -public class Unnest extends AbstractStage { +public class Unnest extends Stage { private static final String name = "unnest"; private final Field field; @@ -39,11 +38,6 @@ public Unnest(@Nonnull Field field, @Nonnull UnnestOptions options) { this.options = options; } - @InternalApi - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { Pipeline.Stage.Builder builder = diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java index 092cd2334..36da8f12e 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/stages/Where.java @@ -23,7 +23,7 @@ import com.google.firestore.v1.Pipeline; @InternalApi -public final class Where extends AbstractStage { +public final class Where extends Stage { private static final String name = "where"; private final FilterCondition condition; @@ -33,16 +33,6 @@ public Where(FilterCondition condition) { this.condition = condition; } - @InternalApi - public FilterCondition getCondition() { - return condition; - } - - @Override - public String getName() { - return name; - } - @Override Pipeline.Stage toStageProto() { return Pipeline.Stage.newBuilder().setName(name).addArgs(encodeValue(condition)).build();