Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,8 @@ default ArrayExpression<T> slice(final int start, final int length) {
ArrayExpression<T> union(ArrayExpression<? extends T> set);

ArrayExpression<T> distinct();

<R extends Expression> R passArrayTo(Function<? super ArrayExpression<T>, ? extends R> f);

<R extends Expression> R switchArrayOn(Function<Branches<ArrayExpression<T>>, ? extends BranchesTerminal<ArrayExpression<T>, ? extends R>> on);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package com.mongodb.client.model.expressions;

import java.util.function.Function;

/**
* Expresses a boolean value.
*/
Expand Down Expand Up @@ -58,4 +60,8 @@ public interface BooleanExpression extends Expression {
* @param <T> The type of the resulting expression.
*/
<T extends Expression> T cond(T left, T right);

<R extends Expression> R passBooleanTo(Function<? super BooleanExpression, ? extends R> f);

<R extends Expression> R switchBooleanOn(Function<Branches<BooleanExpression>, ? extends BranchesTerminal<BooleanExpression, ? extends R>> on);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
* Copyright 2008-present MongoDB, Inc.
*
* 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.mongodb.client.model.expressions;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public final class Branches<T extends Expression> {

Branches() {
}

private static <T extends Expression, R extends Expression> BranchesIntermediary<T, R> with(final Function<T, SwitchCase<R>> switchCase) {
List<Function<T, SwitchCase<R>>> v = new ArrayList<>();
v.add(switchCase);
return new BranchesIntermediary<>(v);
}

private static <T extends Expression> MqlExpression<?> mqlEx(final T value) {
return (MqlExpression<?>) value;
}

// is fn

public <T extends Expression, R extends Expression> BranchesIntermediary<T, R> is(final Function<? super T, BooleanExpression> o, final Function<? super T, ? extends R> r) {
return with(value -> new SwitchCase<>(o.apply(value), r.apply(value)));
}

// eq lt lte

public <R extends Expression> BranchesIntermediary<T, R> eq(final T v, final Function<? super T, ? extends R> r) {
return is(value -> value.eq(v), r);
}

public <R extends Expression> BranchesIntermediary<T, R> lt(final T v, final Function<? super T, ? extends R> r) {
return is(value -> value.lt(v), r);
}

public <R extends Expression> BranchesIntermediary<T, R> lte(final T v, final Function<? super T, ? extends R> r) {
return is(value -> value.lte(v), r);
}

// is type

public <R extends Expression> BranchesIntermediary<T, R> isBoolean(final Function<? super BooleanExpression, ? extends R> r) {
return is(v -> mqlEx(v).isBoolean(), v -> r.apply((BooleanExpression) v));
}

public <R extends Expression> BranchesIntermediary<T, R> isNumber(final Function<? super NumberExpression, ? extends R> r) {
return is(v -> mqlEx(v).isNumber(), v -> r.apply((NumberExpression) v));
}

public <R extends Expression> BranchesIntermediary<T, R> isInteger(final Function<? super IntegerExpression, ? extends R> r) {
return is(v -> mqlEx(v).isInteger(), v -> r.apply((IntegerExpression) v));
}

public <R extends Expression> BranchesIntermediary<T, R> isString(final Function<? super StringExpression, ? extends R> r) {
return is(v -> mqlEx(v).isString(), v -> r.apply((StringExpression) v));
}

public <R extends Expression> BranchesIntermediary<T, R> isDate(final Function<? super DateExpression, ? extends R> r) {
return is(v -> mqlEx(v).isDate(), v -> r.apply((DateExpression) v));
}

@SuppressWarnings("unchecked")
public <R extends Expression, Q extends Expression> BranchesIntermediary<T, R> isArray(final Function<? super ArrayExpression<Q>, ? extends R> r) {
return is(v -> mqlEx(v).isArray(), v -> r.apply((ArrayExpression<Q>) v));
}

public <R extends Expression> BranchesIntermediary<T, R> isDocument(final Function<? super DocumentExpression, ? extends R> r) {
return is(v -> mqlEx(v).isDocumentOrMap(), v -> r.apply((DocumentExpression) v));
}

@SuppressWarnings("unchecked")
public <R extends Expression, Q extends Expression> BranchesIntermediary<T, R> isMap(final Function<? super MapExpression<Q>, ? extends R> r) {
return is(v -> mqlEx(v).isDocumentOrMap(), v -> r.apply((MapExpression<Q>) v));
}

public <R extends Expression> BranchesIntermediary<T, R> isNull(final Function<? super Expression, ? extends R> r) {
return is(v -> mqlEx(v).isNull(), v -> r.apply(v));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* Copyright 2008-present MongoDB, Inc.
*
* 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.mongodb.client.model.expressions;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public final class BranchesIntermediary<T extends Expression, R extends Expression> extends BranchesTerminal<T, R> {
BranchesIntermediary(final List<Function<T, SwitchCase<R>>> branches) {
super(branches, null);
}

private BranchesIntermediary<T, R> with(final Function<T, SwitchCase<R>> switchCase) {
List<Function<T, SwitchCase<R>>> v = new ArrayList<>(this.getBranches());
v.add(switchCase);
return new BranchesIntermediary<>(v);
}

private static <T extends Expression> MqlExpression<?> mqlEx(final T value) {
return (MqlExpression<?>) value;
}

// is fn

public BranchesIntermediary<T, R> is(final Function<? super T, BooleanExpression> o, final Function<? super T, ? extends R> r) {
return this.with(value -> new SwitchCase<>(o.apply(value), r.apply(value)));
}

// eq lt lte

public BranchesIntermediary<T, R> eq(final T v, final Function<? super T, ? extends R> r) {
return is(value -> value.eq(v), r);
}

public BranchesIntermediary<T, R> lt(final T v, final Function<? super T, ? extends R> r) {
return is(value -> value.lt(v), r);
}

public BranchesIntermediary<T, R> lte(final T v, final Function<? super T, ? extends R> r) {
return is(value -> value.lte(v), r);
}

// is type

public BranchesIntermediary<T, R> isBoolean(final Function<? super BooleanExpression, ? extends R> r) {
return is(v -> mqlEx(v).isBoolean(), v -> r.apply((BooleanExpression) v));
}

public BranchesIntermediary<T, R> isNumber(final Function<? super NumberExpression, ? extends R> r) {
return is(v -> mqlEx(v).isNumber(), v -> r.apply((NumberExpression) v));
}

public BranchesIntermediary<T, R> isInteger(final Function<? super IntegerExpression, ? extends R> r) {
return is(v -> mqlEx(v).isInteger(), v -> r.apply((IntegerExpression) v));
}

public BranchesIntermediary<T, R> isString(final Function<? super StringExpression, ? extends R> r) {
return is(v -> mqlEx(v).isString(), v -> r.apply((StringExpression) v));
}

public BranchesIntermediary<T, R> isDate(final Function<? super DateExpression, ? extends R> r) {
return is(v -> mqlEx(v).isDate(), v -> r.apply((DateExpression) v));
}

@SuppressWarnings("unchecked")
public <Q extends Expression> BranchesIntermediary<T, R> isArray(final Function<? super ArrayExpression<Q>, ? extends R> r) {
return is(v -> mqlEx(v).isArray(), v -> r.apply((ArrayExpression<Q>) v));
}

public BranchesIntermediary<T, R> isDocument(final Function<? super DocumentExpression, ? extends R> r) {
return is(v -> mqlEx(v).isDocumentOrMap(), v -> r.apply((DocumentExpression) v));
}

@SuppressWarnings("unchecked")
public <Q extends Expression> BranchesIntermediary<T, R> isMap(final Function<? super MapExpression<Q>, ? extends R> r) {
return is(v -> mqlEx(v).isDocumentOrMap(), v -> r.apply((MapExpression<Q>) v));
}

public BranchesIntermediary<T, R> isNull(final Function<? super Expression, ? extends R> r) {
return is(v -> mqlEx(v).isNull(), v -> r.apply(v));
}

public BranchesTerminal<T, R> defaults(final Function<? super T, ? extends R> r) {
return this.withDefault(value -> r.apply(value));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Copyright 2008-present MongoDB, Inc.
*
* 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.mongodb.client.model.expressions;

import com.mongodb.lang.Nullable;

import java.util.List;
import java.util.function.Function;

public class BranchesTerminal<T extends Expression, R extends Expression> {

private final List<Function<T, SwitchCase<R>>> branches;

private final Function<T, R> defaults;

BranchesTerminal(final List<Function<T, SwitchCase<R>>> branches, @Nullable final Function<T, R> defaults) {
this.branches = branches;
this.defaults = defaults;
}

protected BranchesTerminal<T, R> withDefault(final Function<T, R> defaults) {
return new BranchesTerminal<>(branches, defaults);
}

protected List<Function<T, SwitchCase<R>>> getBranches() {
return branches;
}

@Nullable
protected Function<T, R> getDefaults() {
return defaults;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package com.mongodb.client.model.expressions;

import java.util.function.Function;

/**
* Expresses a date value.
*/
Expand All @@ -33,4 +35,6 @@ public interface DateExpression extends Expression {

StringExpression asString(StringExpression timezone, StringExpression format);

<R extends Expression> R passDateTo(Function<? super DateExpression, ? extends R> f);
<R extends Expression> R switchDateOn(Function<Branches<DateExpression>, ? extends BranchesTerminal<DateExpression, ? extends R>> on);
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.bson.conversions.Bson;

import java.time.Instant;
import java.util.function.Function;

import static com.mongodb.client.model.expressions.Expressions.of;
import static com.mongodb.client.model.expressions.Expressions.ofMap;
Expand Down Expand Up @@ -100,4 +101,7 @@ default <T extends Expression> MapExpression<T> getMap(final String fieldName, f
DocumentExpression merge(DocumentExpression other);

MapExpression<Expression> asMap();

<R extends Expression> R passDocumentTo(Function<? super DocumentExpression, ? extends R> f);
<R extends Expression> R switchDocumentOn(Function<Branches<DocumentExpression>, ? extends BranchesTerminal<DocumentExpression, ? extends R>> on);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

import com.mongodb.annotations.Evolving;

import java.util.function.Function;

/**
* Expressions express values that may be represented in (or computations that
* may be performed within) a MongoDB server. Each expression evaluates to some
Expand Down Expand Up @@ -114,4 +116,9 @@ public interface Expression {
<T extends Expression> MapExpression<T> isMapOr(MapExpression<? extends T> other);

StringExpression asString();

<R extends Expression> R passTo(Function<? super Expression, ? extends R> f);

<R extends Expression> R switchOn(Function<Branches<Expression>, ? extends BranchesTerminal<Expression, ? extends R>> on);

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package com.mongodb.client.model.expressions;

import java.util.function.Function;

/**
* Expresses an integer value.
*/
Expand All @@ -42,4 +44,7 @@ default IntegerExpression subtract(final int subtract) {
IntegerExpression min(IntegerExpression i);

IntegerExpression abs();

<R extends Expression> R passIntegerTo(Function<? super IntegerExpression, ? extends R> f);
<R extends Expression> R switchIntegerOn(Function<Branches<IntegerExpression>, ? extends BranchesTerminal<IntegerExpression, ? extends R>> on);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package com.mongodb.client.model.expressions;

import java.util.function.Function;

import static com.mongodb.client.model.expressions.Expressions.of;

public interface MapExpression<T extends Expression> extends Expression {
Expand Down Expand Up @@ -57,4 +59,7 @@ default MapExpression<T> unset(final String key) {
ArrayExpression<EntryExpression<T>> entrySet();

<R extends DocumentExpression> R asDocument();

<R extends Expression> R passMapTo(Function<? super MapExpression<T>, ? extends R> f);
<R extends Expression> R switchMapOn(Function<Branches<MapExpression<T>>, ? extends BranchesTerminal<MapExpression<T>, ? extends R>> on);
}
Loading