From 28928efd79e753898668bc8cb7ad82ae1d2dd8c4 Mon Sep 17 00:00:00 2001 From: Andrea Di Cesare Date: Fri, 27 Oct 2023 09:45:42 +0200 Subject: [PATCH] :recycle: Refactor query and aggregation operator interpolation classes --- ...erpolator.java => StagesInterpolator.java} | 54 ++++++++++--------- ...nterpolator.java => VarsInterpolator.java} | 6 +-- .../graphql/models/AggregationMapping.java | 7 +-- .../graphql/models/QueryMapping.java | 6 +-- .../exchange/MongoRequestPropsInjector.java | 4 +- .../aggregation/GetAggregationHandler.java | 7 +-- .../handlers/aggregation/MapReduce.java | 7 +-- .../changestreams/GetChangeStreamHandler.java | 8 +-- .../aggregation/AggregationPipelineTest.java | 27 +++++----- 9 files changed, 68 insertions(+), 58 deletions(-) rename commons/src/main/java/org/restheart/mongodb/utils/{AggregationInterpolator.java => StagesInterpolator.java} (66%) rename commons/src/main/java/org/restheart/mongodb/utils/{VarOperatorsInterpolator.java => VarsInterpolator.java} (94%) diff --git a/commons/src/main/java/org/restheart/mongodb/utils/AggregationInterpolator.java b/commons/src/main/java/org/restheart/mongodb/utils/StagesInterpolator.java similarity index 66% rename from commons/src/main/java/org/restheart/mongodb/utils/AggregationInterpolator.java rename to commons/src/main/java/org/restheart/mongodb/utils/StagesInterpolator.java index b38edfcf7..cd2c79b74 100644 --- a/commons/src/main/java/org/restheart/mongodb/utils/AggregationInterpolator.java +++ b/commons/src/main/java/org/restheart/mongodb/utils/StagesInterpolator.java @@ -29,34 +29,38 @@ import org.bson.BsonValue; import org.restheart.exchange.InvalidMetadataException; import org.restheart.exchange.QueryVariableNotBoundException; -import static org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import static org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; import org.restheart.utils.BsonUtils; import org.restheart.utils.LambdaUtils; /** - * Utility class for interpolating aggregation stages with a specified format, e.g., { : "name"}, + * Utility class for interpolating aggregation stages with a specified format, e.g., { [operator]: "name"}, * and replacing placeholders with provided values. It also supports conditional stages using - * { "$ifvar": }, which are removed if the variable is missing. + * { "$ifvar": [var] }, which are removed if the variable is missing. */ -public class AggregationInterpolator { +public class StagesInterpolator { + public enum STAGE_OPERATOR { $ifvar, $ifarg }; + /** + * @param varOperator the var operator, $var for queries and aggregations, $arg for GraphQL mappings + * @param stageOperator the stagee operator, $ifvar for aggregations, $ifarg for GraphQL mappings * @param stages the aggregation pipeline stages * @param values RequestContext.getAggregationVars() * @return the stages, with unescaped operators and bound variables * @throws org.restheart.exchange.InvalidMetadataException * @throws org.restheart.exchange.QueryVariableNotBoundException */ - public static List interpolate(OPERATOR operator, BsonArray stages, BsonDocument values) throws InvalidMetadataException, QueryVariableNotBoundException { + public static List interpolate(VAR_OPERATOR varOperator, STAGE_OPERATOR stageOperator, BsonArray stages, BsonDocument values) throws InvalidMetadataException, QueryVariableNotBoundException { var stagesWithUnescapedOperators = BsonUtils.unescapeKeys(stages).asArray(); // check optional stages stagesWithUnescapedOperators.stream() .map(s -> s.asDocument()) - .filter(stage -> optional(stage)).forEach(optionalStage -> { + .filter(stage -> optional(stageOperator, stage)).forEach(optionalStage -> { try { - checkIfVar(optionalStage); + checkIfVar(stageOperator, optionalStage); } catch(InvalidMetadataException ime) { LambdaUtils.throwsSneakyException(ime); } @@ -64,11 +68,11 @@ public static List interpolate(OPERATOR operator, BsonArray stages var stagesWithoutUnboudOptionalStages = stagesWithUnescapedOperators.stream() .map(s -> s.asDocument()) - .map(stage -> _stage(stage, values)) + .map(stage -> _stage(stageOperator, stage, values)) .filter(stage -> stage != null) .collect(Collectors.toCollection(BsonArray::new)); - var resolvedStages = VarOperatorsInterpolator.interpolate(operator, stagesWithoutUnboudOptionalStages, values).asArray(); + var resolvedStages = VarsInterpolator.interpolate(varOperator, stagesWithoutUnboudOptionalStages, values).asArray(); var ret = new ArrayList(); @@ -102,7 +106,7 @@ public static void shouldNotContainOperators(BsonValue values) throws SecurityEx } else if (values.isArray()) { values.asArray().getValues().stream() .filter(el -> (el.isDocument() || el.isArray())) - .forEachOrdered(AggregationInterpolator::shouldNotContainOperators); + .forEachOrdered(StagesInterpolator::shouldNotContainOperators); } } /** @@ -110,8 +114,8 @@ public static void shouldNotContainOperators(BsonValue values) throws SecurityEx * @return true if stage is optional * @throws InvalidMetadataException */ - private static boolean optional(BsonDocument stage) { - return stage.containsKey("$ifvar"); + private static boolean optional(STAGE_OPERATOR stageOperator, BsonDocument stage) { + return stage.containsKey(stageOperator.name()); } /** @@ -119,9 +123,9 @@ private static boolean optional(BsonDocument stage) { * @return true if optional stage is valid * @throws InvalidMetadataException */ - private static void checkIfVar(BsonDocument stage) throws InvalidMetadataException { - if (stage.containsKey("$ifvar")) { - var ifvar = stage.get("$ifvar"); + private static void checkIfVar(STAGE_OPERATOR stageOperator, BsonDocument stage) throws InvalidMetadataException { + if (stage.containsKey(stageOperator.name())) { + var ifvar = stage.get(stageOperator.name()); if (!(ifvar.isArray() && (ifvar.asArray().size() == 2 || ifvar.asArray().size() == 3) && (ifvar.asArray().get(0).isString() || @@ -133,8 +137,8 @@ private static void checkIfVar(BsonDocument stage) throws InvalidMetadataExcepti } } - private static boolean stageApplies(BsonDocument stage, BsonDocument avars) { - var vars = stage.get("$ifvar").asArray().get(0); + private static boolean stageApplies(STAGE_OPERATOR stageOperator, BsonDocument stage, BsonDocument avars) { + var vars = stage.get(stageOperator.name()).asArray().get(0); if (vars.isString()) { return BsonUtils.get(avars, vars.asString().getValue()).isPresent(); @@ -143,20 +147,20 @@ private static boolean stageApplies(BsonDocument stage, BsonDocument avars) { } } - private static BsonDocument elseStage(BsonDocument stage) { - return stage.get("$ifvar").asArray().size() > 2 - ? stage.get("$ifvar").asArray().get(2).asDocument() + private static BsonDocument elseStage(STAGE_OPERATOR stageOperator, BsonDocument stage) { + return stage.get(stageOperator.name()).asArray().size() > 2 + ? stage.get(stageOperator.name()).asArray().get(2).asDocument() : null; } - private static BsonDocument _stage(BsonDocument stage, BsonDocument avars) { - if (!optional(stage)) { + private static BsonDocument _stage(STAGE_OPERATOR stageOperator, BsonDocument stage, BsonDocument avars) { + if (!optional(stageOperator, stage)) { return stage; - } else if (stageApplies(stage, avars)){ - return stage.get("$ifvar").asArray().get(1).asDocument(); + } else if (stageApplies(stageOperator, stage, avars)){ + return stage.get(stageOperator.name()).asArray().get(1).asDocument(); } else { - return elseStage(stage); // null, if no else stage specified + return elseStage(stageOperator, stage); // null, if no else stage specified } } diff --git a/commons/src/main/java/org/restheart/mongodb/utils/VarOperatorsInterpolator.java b/commons/src/main/java/org/restheart/mongodb/utils/VarsInterpolator.java similarity index 94% rename from commons/src/main/java/org/restheart/mongodb/utils/VarOperatorsInterpolator.java rename to commons/src/main/java/org/restheart/mongodb/utils/VarsInterpolator.java index 4d0e205af..b9d905e2a 100644 --- a/commons/src/main/java/org/restheart/mongodb/utils/VarOperatorsInterpolator.java +++ b/commons/src/main/java/org/restheart/mongodb/utils/VarsInterpolator.java @@ -32,8 +32,8 @@ * such as { [operator]: "name"}, and replacing placeholders with provided values. * The class facilitates the dynamic substitution of placeholders in BSON documents and arrays. */ -public class VarOperatorsInterpolator { - public enum OPERATOR { $var, $arg }; +public class VarsInterpolator { + public enum VAR_OPERATOR { $var, $arg }; /** * @param operator * @param bson the BsonDocument or BsonArray containing variables @@ -47,7 +47,7 @@ public enum OPERATOR { $var, $arg }; * @throws org.restheart.exchange.InvalidMetadataException * @throws org.restheart.exchange.QueryVariableNotBoundException */ - public static BsonValue interpolate(OPERATOR operator, BsonValue bson, BsonDocument values) throws InvalidMetadataException, QueryVariableNotBoundException { + public static BsonValue interpolate(VAR_OPERATOR operator, BsonValue bson, BsonDocument values) throws InvalidMetadataException, QueryVariableNotBoundException { if (bson == null) { return null; } diff --git a/graphql/src/main/java/org/restheart/graphql/models/AggregationMapping.java b/graphql/src/main/java/org/restheart/graphql/models/AggregationMapping.java index 4e8d5cac9..4cc4bc3d5 100644 --- a/graphql/src/main/java/org/restheart/graphql/models/AggregationMapping.java +++ b/graphql/src/main/java/org/restheart/graphql/models/AggregationMapping.java @@ -39,8 +39,9 @@ import org.restheart.graphql.datafetchers.GQLBatchAggregationDataFetcher; import org.restheart.graphql.datafetchers.GraphQLDataFetcher; import org.restheart.graphql.dataloaders.AggregationBatchLoader; -import org.restheart.mongodb.utils.AggregationInterpolator; -import org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import org.restheart.mongodb.utils.StagesInterpolator; +import org.restheart.mongodb.utils.StagesInterpolator.STAGE_OPERATOR; +import org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; import org.restheart.utils.BsonUtils; import graphql.schema.DataFetchingEnvironment; @@ -96,7 +97,7 @@ public List interpolateArgs(DataFetchingEnvironment env) throws Qu } try { - var argInterpolated = AggregationInterpolator.interpolate(OPERATOR.$arg, stages, values); + var argInterpolated = StagesInterpolator.interpolate(VAR_OPERATOR.$arg, STAGE_OPERATOR.$ifarg, stages, values); var argAndFkInterpolated = new ArrayList(); for (var s: argInterpolated) { diff --git a/graphql/src/main/java/org/restheart/graphql/models/QueryMapping.java b/graphql/src/main/java/org/restheart/graphql/models/QueryMapping.java index 443b795d3..68db05d1b 100644 --- a/graphql/src/main/java/org/restheart/graphql/models/QueryMapping.java +++ b/graphql/src/main/java/org/restheart/graphql/models/QueryMapping.java @@ -34,8 +34,8 @@ import org.restheart.graphql.datafetchers.GQLQueryDataFetcher; import org.restheart.graphql.datafetchers.GraphQLDataFetcher; import org.restheart.graphql.dataloaders.QueryBatchLoader; -import org.restheart.mongodb.utils.VarOperatorsInterpolator; -import org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import org.restheart.mongodb.utils.VarsInterpolator; +import org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; import org.restheart.utils.BsonUtils; import graphql.schema.DataFetchingEnvironment; @@ -141,7 +141,7 @@ public BsonDocument interpolateArgs(DataFetchingEnvironment env) throws IllegalA } try { - var argInterpolated = VarOperatorsInterpolator.interpolate(OPERATOR.$arg, bsonDoc, values); + var argInterpolated = VarsInterpolator.interpolate(VAR_OPERATOR.$arg, bsonDoc, values); var argAndFkIntepolated = argInterpolated; if (argInterpolated.isDocument()) { diff --git a/mongodb/src/main/java/org/restheart/mongodb/exchange/MongoRequestPropsInjector.java b/mongodb/src/main/java/org/restheart/mongodb/exchange/MongoRequestPropsInjector.java index 6ca0247fd..ca51731d4 100644 --- a/mongodb/src/main/java/org/restheart/mongodb/exchange/MongoRequestPropsInjector.java +++ b/mongodb/src/main/java/org/restheart/mongodb/exchange/MongoRequestPropsInjector.java @@ -47,7 +47,7 @@ import org.restheart.exchange.MongoResponse; import org.restheart.exchange.UnsupportedDocumentIdException; import org.restheart.mongodb.MongoServiceConfiguration; -import org.restheart.mongodb.utils.AggregationInterpolator; +import org.restheart.mongodb.utils.StagesInterpolator; import org.restheart.mongodb.utils.MongoURLUtils; import org.restheart.utils.HttpStatus; import org.restheart.utils.BsonUtils; @@ -309,7 +309,7 @@ public static void inject(HttpServerExchange exchange) { // throws SecurityException if aVars contains operators if (MongoServiceConfiguration.get().getAggregationCheckOperators()) { - AggregationInterpolator.shouldNotContainOperators(qvars); + StagesInterpolator.shouldNotContainOperators(qvars); } request.setAggregationVars(qvars); diff --git a/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/GetAggregationHandler.java b/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/GetAggregationHandler.java index 68e9f179d..0431ffe91 100644 --- a/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/GetAggregationHandler.java +++ b/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/GetAggregationHandler.java @@ -45,8 +45,9 @@ import org.restheart.security.WithProperties; import org.restheart.utils.BsonUtils; import org.restheart.utils.HttpStatus; -import org.restheart.mongodb.utils.AggregationInterpolator; -import static org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import org.restheart.mongodb.utils.StagesInterpolator; +import static org.restheart.mongodb.utils.StagesInterpolator.STAGE_OPERATOR; +import static org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -161,7 +162,7 @@ public void handleRequest(HttpServerExchange exchange) throws Exception { try { var clientSession = request.getClientSession(); - var stages = AggregationInterpolator.interpolate(OPERATOR.$var, pipeline.getStages(), avars); + var stages = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, pipeline.getStages(), avars); if (clientSession == null) { agrOutput = dbs.collection(request.rsOps(), request.getDBName(), request.getCollectionName()) diff --git a/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/MapReduce.java b/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/MapReduce.java index 85c8f1812..e304fa9f0 100644 --- a/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/MapReduce.java +++ b/mongodb/src/main/java/org/restheart/mongodb/handlers/aggregation/MapReduce.java @@ -21,12 +21,13 @@ package org.restheart.mongodb.handlers.aggregation; import java.util.regex.Matcher; + import org.bson.BsonDocument; import org.bson.BsonValue; import org.restheart.exchange.InvalidMetadataException; import org.restheart.exchange.QueryVariableNotBoundException; -import org.restheart.mongodb.utils.VarOperatorsInterpolator; -import static org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import org.restheart.mongodb.utils.VarsInterpolator; +import static org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; import org.restheart.utils.BsonUtils; /** @@ -145,7 +146,7 @@ public BsonValue getQuery() { */ public BsonDocument getResolvedQuery(BsonDocument aVars) throws InvalidMetadataException, QueryVariableNotBoundException { - return VarOperatorsInterpolator.interpolate(OPERATOR.$var, BsonUtils.unescapeKeys(query), aVars).asDocument(); + return VarsInterpolator.interpolate(VAR_OPERATOR.$var, BsonUtils.unescapeKeys(query), aVars).asDocument(); } /** diff --git a/mongodb/src/main/java/org/restheart/mongodb/handlers/changestreams/GetChangeStreamHandler.java b/mongodb/src/main/java/org/restheart/mongodb/handlers/changestreams/GetChangeStreamHandler.java index 1d2895d57..55cf9f6ea 100644 --- a/mongodb/src/main/java/org/restheart/mongodb/handlers/changestreams/GetChangeStreamHandler.java +++ b/mongodb/src/main/java/org/restheart/mongodb/handlers/changestreams/GetChangeStreamHandler.java @@ -21,6 +21,7 @@ package org.restheart.mongodb.handlers.changestreams; import com.mongodb.client.model.changestream.FullDocument; + import io.undertow.Handlers; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; @@ -37,8 +38,9 @@ import org.restheart.exchange.QueryVariableNotBoundException; import org.restheart.handlers.PipelinedHandler; import org.restheart.mongodb.RHMongoClients; -import org.restheart.mongodb.utils.AggregationInterpolator; -import org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import org.restheart.mongodb.utils.StagesInterpolator; +import org.restheart.mongodb.utils.StagesInterpolator.STAGE_OPERATOR; +import org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; import org.restheart.utils.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -138,7 +140,7 @@ private List getResolvedStagesAsList(MongoRequest request) throws ChangeStreamOperation pipeline = _query.get(); - List resolvedStages = AggregationInterpolator.interpolate(OPERATOR.$var, pipeline.getStages(), request.getAggregationVars()); + List resolvedStages = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, pipeline.getStages(), request.getAggregationVars()); return resolvedStages; } diff --git a/mongodb/src/test/java/org/restheart/mongodb/handlers/aggregation/AggregationPipelineTest.java b/mongodb/src/test/java/org/restheart/mongodb/handlers/aggregation/AggregationPipelineTest.java index f961112d4..fbe218ed2 100644 --- a/mongodb/src/test/java/org/restheart/mongodb/handlers/aggregation/AggregationPipelineTest.java +++ b/mongodb/src/test/java/org/restheart/mongodb/handlers/aggregation/AggregationPipelineTest.java @@ -29,8 +29,9 @@ import org.junit.jupiter.api.Test; import org.restheart.exchange.QueryVariableNotBoundException; import org.restheart.utils.BsonUtils; -import org.restheart.mongodb.utils.AggregationInterpolator; -import static org.restheart.mongodb.utils.VarOperatorsInterpolator.OPERATOR; +import org.restheart.mongodb.utils.StagesInterpolator; +import org.restheart.mongodb.utils.StagesInterpolator.STAGE_OPERATOR; +import static org.restheart.mongodb.utils.VarsInterpolator.VAR_OPERATOR; public class AggregationPipelineTest { @Test @@ -48,7 +49,7 @@ public void testSimpleAggregation() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - assertEquals(1, AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(), new BsonDocument()).size()); + assertEquals(1, StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(), new BsonDocument()).size()); } @Test @@ -67,7 +68,7 @@ public void testUnboundAVar() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - assertThrows(QueryVariableNotBoundException.class, () -> AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().get())); + assertThrows(QueryVariableNotBoundException.class, () -> StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().get())); } @Test @@ -86,7 +87,7 @@ public void testBoundAVar() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - var resolvedStages = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(), document().put("name", "foo").get()); + var resolvedStages = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(), document().put("name", "foo").get()); assertEquals(1, resolvedStages.size()); assertEquals(new BsonString("foo"), resolvedStages.get(0).getDocument("$match").getString("name")); @@ -107,13 +108,13 @@ public void testOptionalParameter() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - var resolvedStagesShouldUseAvar = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().put("s", document().put("surname", -1)).get()); + var resolvedStagesShouldUseAvar = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().put("s", document().put("surname", -1)).get()); assertEquals(1, resolvedStagesShouldUseAvar.size()); assertEquals(document().put("surname", -1).get(), resolvedStagesShouldUseAvar.get(0).getDocument("$sort")); - var resolvedStagesShouldUseDefaultValue = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().get()); + var resolvedStagesShouldUseDefaultValue = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().get()); assertEquals(1, resolvedStagesShouldUseDefaultValue.size()); assertEquals(document().put("surname", 1).get(), @@ -136,12 +137,12 @@ public void testOptionalStageWithOneVar() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - var optinalStagesShouldBeIn = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().put("s", document().put("surname", -1)).get()); + var optinalStagesShouldBeIn = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().put("s", document().put("surname", -1)).get()); assertEquals(2, optinalStagesShouldBeIn.size()); assertEquals(document().put("surname", -1).get(), optinalStagesShouldBeIn.get(1).getDocument("$sort")); - var optinalStagesShouldBeOut = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().get()); + var optinalStagesShouldBeOut = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().get()); assertEquals(1, optinalStagesShouldBeOut.size()); assertEquals(document().put("name", "foo").get(), optinalStagesShouldBeOut.get(0).getDocument("$match")); @@ -163,14 +164,14 @@ public void testOptionalStageWithTwoVars() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - var optinalStagesShouldBeIn = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document() + var optinalStagesShouldBeIn = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document() .put("s", document().put("surname", -1)) .put("n", 1).get()); assertEquals(2, optinalStagesShouldBeIn.size()); assertEquals(document().put("surname", -1).get(), optinalStagesShouldBeIn.get(1).getDocument("$sort")); - var optinalStagesShouldBeOut = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().get()); + var optinalStagesShouldBeOut = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().get()); assertEquals(1, optinalStagesShouldBeOut.size()); assertEquals(document().put("name", "foo").get(), optinalStagesShouldBeOut.get(0).getDocument("$match")); @@ -192,13 +193,13 @@ public void testOptionalStageWithElse() throws Exception { var apDef = BsonUtils.parse(aggr).asDocument(); var ap = new AggregationPipeline(apDef); - var optinalStagesShouldBeUsed = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document() + var optinalStagesShouldBeUsed = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document() .put("s", document().put("surname", -1)).get()); assertEquals(2, optinalStagesShouldBeUsed.size()); assertEquals(document().put("surname", -1).get(), optinalStagesShouldBeUsed.get(1).getDocument("$sort")); - var elseStageShouldBeUsed = AggregationInterpolator.interpolate(OPERATOR.$var, ap.getStages(),document().get()); + var elseStageShouldBeUsed = StagesInterpolator.interpolate(VAR_OPERATOR.$var, STAGE_OPERATOR.$ifvar, ap.getStages(),document().get()); assertEquals(2, elseStageShouldBeUsed.size()); assertEquals(document().put("else", 1).get(), elseStageShouldBeUsed.get(1).getDocument("$sort"));