Search in sources :

Example 1 with DistributionFunction

use of org.apache.ignite.internal.sql.engine.trait.DistributionFunction in project ignite-3 by apache.

the class AbstractIgniteJoin method passThroughDistribution.

/**
 * {@inheritDoc}
 */
@Override
public Pair<RelTraitSet, List<RelTraitSet>> passThroughDistribution(RelTraitSet nodeTraits, List<RelTraitSet> inputTraits) {
    // Tere are several rules:
    // 1) any join is possible on broadcast or single distribution
    // 2) hash distributed join is possible when join keys equal to source distribution keys
    // 3) hash and broadcast distributed tables can be joined when join keys equal to hash
    // distributed table distribution keys and:
    // 3.1) it's a left join and a hash distributed table is at left
    // 3.2) it's a right join and a hash distributed table is at right
    // 3.3) it's an inner join, this case a hash distributed table may be at any side
    RelTraitSet left = inputTraits.get(0);
    RelTraitSet right = inputTraits.get(1);
    IgniteDistribution distribution = TraitUtils.distribution(nodeTraits);
    RelDistribution.Type distrType = distribution.getType();
    switch(distrType) {
        case BROADCAST_DISTRIBUTED:
        case SINGLETON:
            return Pair.of(nodeTraits, Commons.transform(inputTraits, t -> t.replace(distribution)));
        case HASH_DISTRIBUTED:
        case RANDOM_DISTRIBUTED:
            // It's impossible to get random or hash distribution from a cross join.
            if (nullOrEmpty(joinInfo.pairs())) {
                break;
            }
            // We cannot provide random distribution without unique constrain on join keys,
            // so, we require hash distribution (wich satisfies random distribution) instead.
            DistributionFunction function = distrType == HASH_DISTRIBUTED ? distribution.function() : DistributionFunction.hash();
            IgniteDistribution outDistr = hash(joinInfo.leftKeys, function);
            if (distrType != HASH_DISTRIBUTED || outDistr.satisfies(distribution)) {
                return Pair.of(nodeTraits.replace(outDistr), List.of(left.replace(outDistr), right.replace(hash(joinInfo.rightKeys, function))));
            }
            break;
        default:
    }
    return Pair.of(nodeTraits.replace(single()), Commons.transform(inputTraits, t -> t.replace(single())));
}
Also used : DistributionFunction(org.apache.ignite.internal.sql.engine.trait.DistributionFunction) IgniteDistributions.single(org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.single) Mappings(org.apache.calcite.util.mapping.Mappings) CollectionUtils.nullOrEmpty(org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty) HashMap(java.util.HashMap) Join(org.apache.calcite.rel.core.Join) CorrelationTrait(org.apache.ignite.internal.sql.engine.trait.CorrelationTrait) IgniteMdRowCount.joinRowCount(org.apache.ignite.internal.sql.engine.metadata.IgniteMdRowCount.joinRowCount) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) IgniteDistributions.broadcast(org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.broadcast) RIGHT(org.apache.calcite.rel.core.JoinRelType.RIGHT) CorrelationId(org.apache.calcite.rel.core.CorrelationId) RexNode(org.apache.calcite.rex.RexNode) IgniteDistribution(org.apache.ignite.internal.sql.engine.trait.IgniteDistribution) Pair(org.apache.calcite.util.Pair) TraitsAwareIgniteRel(org.apache.ignite.internal.sql.engine.trait.TraitsAwareIgniteRel) Map(java.util.Map) RewindabilityTrait(org.apache.ignite.internal.sql.engine.trait.RewindabilityTrait) RelTraitSet(org.apache.calcite.plan.RelTraitSet) RelOptCluster(org.apache.calcite.plan.RelOptCluster) RelCollations(org.apache.calcite.rel.RelCollations) ImmutableIntList(org.apache.calcite.util.ImmutableIntList) IgniteDistributions.random(org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.random) Set(java.util.Set) SqlExplainLevel(org.apache.calcite.sql.SqlExplainLevel) RelNode(org.apache.calcite.rel.RelNode) IgniteDistributions.hash(org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.hash) RelFieldCollation(org.apache.calcite.rel.RelFieldCollation) Commons(org.apache.ignite.internal.sql.engine.util.Commons) RelWriter(org.apache.calcite.rel.RelWriter) List(java.util.List) TraitUtils(org.apache.ignite.internal.sql.engine.trait.TraitUtils) RelMetadataQuery(org.apache.calcite.rel.metadata.RelMetadataQuery) RelCollation(org.apache.calcite.rel.RelCollation) RelDistribution(org.apache.calcite.rel.RelDistribution) HASH_DISTRIBUTED(org.apache.calcite.rel.RelDistribution.Type.HASH_DISTRIBUTED) JoinRelType(org.apache.calcite.rel.core.JoinRelType) Util(org.apache.calcite.util.Util) RelTraitSet(org.apache.calcite.plan.RelTraitSet) IgniteDistribution(org.apache.ignite.internal.sql.engine.trait.IgniteDistribution) DistributionFunction(org.apache.ignite.internal.sql.engine.trait.DistributionFunction) RelDistribution(org.apache.calcite.rel.RelDistribution)

Aggregations

ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 RelOptCluster (org.apache.calcite.plan.RelOptCluster)1 RelTraitSet (org.apache.calcite.plan.RelTraitSet)1 RelCollation (org.apache.calcite.rel.RelCollation)1 RelCollations (org.apache.calcite.rel.RelCollations)1 RelDistribution (org.apache.calcite.rel.RelDistribution)1 HASH_DISTRIBUTED (org.apache.calcite.rel.RelDistribution.Type.HASH_DISTRIBUTED)1 RelFieldCollation (org.apache.calcite.rel.RelFieldCollation)1 RelNode (org.apache.calcite.rel.RelNode)1 RelWriter (org.apache.calcite.rel.RelWriter)1 CorrelationId (org.apache.calcite.rel.core.CorrelationId)1 Join (org.apache.calcite.rel.core.Join)1 JoinRelType (org.apache.calcite.rel.core.JoinRelType)1 RIGHT (org.apache.calcite.rel.core.JoinRelType.RIGHT)1 RelMetadataQuery (org.apache.calcite.rel.metadata.RelMetadataQuery)1