## Uses of Interface
org.optaplanner.core.api.score.stream.tri.TriJoiner

- Packages that use TriJoiner
  Package | Description
  --- | ---
  org.optaplanner.core.api.score.stream | The `ConstraintStream` API: a way to define constraints for `Score` calculation.
  org.optaplanner.core.api.score.stream.bi | The `ConstraintStream` API for bi-tuples.
  org.optaplanner.core.impl.score.stream.bavet.bi |
  org.optaplanner.core.impl.score.stream.bi |
  org.optaplanner.core.impl.score.stream.drools.bi |
  org.optaplanner.core.impl.score.stream.drools.tri |
  org.optaplanner.core.impl.score.stream.tri |

- - ### Uses of TriJoiner in org.optaplanner.core.api.score.stream

    Methods in org.optaplanner.core.api.score.stream that return TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `static <A,​B,​C,​Property_> TriJoiner<A,​B,​C>` | Joiners.`equal​(BiFunction<A,​B,​Property_> leftMapping, Function<C,​Property_> rightMapping)` |
    `static <A,​B,​C> TriJoiner<A,​B,​C>` | Joiners.`filtering​(TriPredicate<A,​B,​C> filter)` |
    `static <A,​B,​C,​Property_ extends Comparable<Property_>> TriJoiner<A,​B,​C>` | Joiners.`greaterThan​(BiFunction<A,​B,​Property_> leftMapping, Function<C,​Property_> rightMapping)` |
    `static <A,​B,​C,​Property_ extends Comparable<Property_>> TriJoiner<A,​B,​C>` | Joiners.`greaterThanOrEqual​(BiFunction<A,​B,​Property_> leftMapping, Function<C,​Property_> rightMapping)` |
    `static <A,​B,​C,​Property_ extends Comparable<Property_>> TriJoiner<A,​B,​C>` | Joiners.`lessThan​(BiFunction<A,​B,​Property_> leftMapping, Function<C,​Property_> rightMapping)` |
    `static <A,​B,​C,​Property_ extends Comparable<Property_>> TriJoiner<A,​B,​C>` | Joiners.`lessThanOrEqual​(BiFunction<A,​B,​Property_> leftMapping, Function<C,​Property_> rightMapping)` |

  - ### Uses of TriJoiner in org.optaplanner.core.api.score.stream.bi

    Methods in org.optaplanner.core.api.score.stream.bi with parameters of type TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner)` | Create a new `BiConstraintStream` for every pair of A and B where C exists for which the `TriJoiner` is true (for the properties it extracts from the facts).
    `<C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` | As defined by `BiConstraintStream.ifExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2)` | As defined by `BiConstraintStream.ifExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2, TriJoiner<A,​B,​C> joiner3)` | As defined by `BiConstraintStream.ifExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2, TriJoiner<A,​B,​C> joiner3, TriJoiner<A,​B,​C> joiner4)` | As defined by `BiConstraintStream.ifExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner)` | Create a new `BiConstraintStream` for every pair of A and B where C does not exist for which the `TriJoiner` is true (for the properties it extracts from the facts).
    `<C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` | As defined by `BiConstraintStream.ifNotExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2)` | As defined by `BiConstraintStream.ifNotExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2, TriJoiner<A,​B,​C> joiner3)` | As defined by `BiConstraintStream.ifNotExists(Class, TriJoiner)`.
    `default <C> BiConstraintStream<A,​B>` | BiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2, TriJoiner<A,​B,​C> joiner3, TriJoiner<A,​B,​C> joiner4)` | As defined by `BiConstraintStream.ifNotExists(Class, TriJoiner)`.
    `default <C> TriConstraintStream<A,​B,​C>` | BiConstraintStream.`join​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner)` | Create a new `TriConstraintStream` for every combination of [A, B] and C for which the `TriJoiner` is true (for the properties it extracts from both facts).
    `default <C> TriConstraintStream<A,​B,​C>` | BiConstraintStream.`join​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` | As defined by `BiConstraintStream.join(Class, TriJoiner)`.
    `default <C> TriConstraintStream<A,​B,​C>` | BiConstraintStream.`join​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2)` | As defined by `BiConstraintStream.join(Class, TriJoiner)`.
    `default <C> TriConstraintStream<A,​B,​C>` | BiConstraintStream.`join​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2, TriJoiner<A,​B,​C> joiner3)` | As defined by `BiConstraintStream.join(Class, TriJoiner)`.
    `default <C> TriConstraintStream<A,​B,​C>` | BiConstraintStream.`join​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner1, TriJoiner<A,​B,​C> joiner2, TriJoiner<A,​B,​C> joiner3, TriJoiner<A,​B,​C> joiner4)` | As defined by `BiConstraintStream.join(Class, TriJoiner)`.
    `<C> TriConstraintStream<A,​B,​C>` | BiConstraintStream.`join​(UniConstraintStream<C> otherStream, TriJoiner<A,​B,​C> joiner)` | Create a new `TriConstraintStream` for every combination of [A, B] and C for which the `TriJoiner` is true (for the properties it extracts from both facts).

  - ### Uses of TriJoiner in org.optaplanner.core.impl.score.stream.bavet.bi

    Methods in org.optaplanner.core.impl.score.stream.bavet.bi with parameters of type TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `<C> BiConstraintStream<A,​B>` | BavetAbstractBiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `<C> BiConstraintStream<A,​B>` | BavetAbstractBiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `<C> TriConstraintStream<A,​B,​C>` | BavetAbstractBiConstraintStream.`join​(UniConstraintStream<C> otherStream, TriJoiner<A,​B,​C> joiner)` |

  - ### Uses of TriJoiner in org.optaplanner.core.impl.score.stream.bi

    Methods in org.optaplanner.core.impl.score.stream.bi that return TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `protected TriJoiner<A,​B,​C>` | BiConstraintStreamHelper.`mergeJoiners​(TriJoiner<A,​B,​C>... joiners)` |

    Methods in org.optaplanner.core.impl.score.stream.bi with parameters of type TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `protected TriConstraintStream<A,​B,​C>` | BiConstraintStreamHelper.`doJoin​(Class<C> otherClass, TriJoiner<A,​B,​C> joiner)` |
    `protected TriConstraintStream<A,​B,​C>` | BiConstraintStreamHelper.`doJoin​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `protected TriPredicate<A,​B,​C>` | BiConstraintStreamHelper.`extractPredicate​(TriJoiner<A,​B,​C> joiner)` |
    `protected boolean` | BiConstraintStreamHelper.`isFilteringJoiner​(TriJoiner<A,​B,​C> joiner)` |
    `protected TriJoiner<A,​B,​C>` | BiConstraintStreamHelper.`mergeJoiners​(TriJoiner<A,​B,​C>... joiners)` |

  - ### Uses of TriJoiner in org.optaplanner.core.impl.score.stream.drools.bi

    Methods in org.optaplanner.core.impl.score.stream.drools.bi with parameters of type TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `<C> DroolsBiCondition<A,​B,​PatternVar>` | DroolsBiCondition.`andIfExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `<C> DroolsBiCondition<A,​B,​PatternVar>` | DroolsBiCondition.`andIfNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `<C> BiConstraintStream<A,​B>` | DroolsAbstractBiConstraintStream.`ifExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `<C> BiConstraintStream<A,​B>` | DroolsAbstractBiConstraintStream.`ifNotExists​(Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |
    `<C> TriConstraintStream<A,​B,​C>` | DroolsAbstractBiConstraintStream.`join​(UniConstraintStream<C> otherStream, TriJoiner<A,​B,​C> joiner)` |

    Constructors in org.optaplanner.core.impl.score.stream.drools.bi with parameters of type TriJoiner
    Constructor | Description
    --- | ---
    `DroolsExistsBiConstraintStream​(DroolsConstraintFactory<Solution_> constraintFactory, DroolsAbstractBiConstraintStream<Solution_,​A,​B> parent, boolean shouldExist, Class<C> otherClass, TriJoiner<A,​B,​C>... joiners)` |

  - ### Uses of TriJoiner in org.optaplanner.core.impl.score.stream.drools.tri

    Constructors in org.optaplanner.core.impl.score.stream.drools.tri with parameters of type TriJoiner
    Constructor | Description
    --- | ---
    `DroolsJoinTriConstraintStream​(DroolsConstraintFactory<Solution_> constraintFactory, DroolsAbstractBiConstraintStream<Solution_,​A,​B> parent, DroolsAbstractUniConstraintStream<Solution_,​C> otherStream, TriJoiner<A,​B,​C> triJoiner)` |

  - ### Uses of TriJoiner in org.optaplanner.core.impl.score.stream.tri

    Classes in org.optaplanner.core.impl.score.stream.tri that implement TriJoiner
    Modifier and Type | Class | Description
    --- | --- | ---
    `class` | `AbstractTriJoiner<A,​B,​C>` |
    `class` | `CompositeTriJoiner<A,​B,​C>` |
    `class` | `FilteringTriJoiner<A,​B,​C>` |
    `class` | `NoneTriJoiner<A,​B,​C>` |
    `class` | `SingleTriJoiner<A,​B,​C>` |

    Methods in org.optaplanner.core.impl.score.stream.tri with parameters of type TriJoiner
    Modifier and Type | Method | Description
    --- | --- | ---
    `static <A,​B,​C> AbstractTriJoiner<A,​B,​C>` | AbstractTriJoiner.`merge​(TriJoiner<A,​B,​C>... joiners)` |