Search in sources :

Example 16 with RelTableRef

use of org.apache.calcite.rex.RexTableInputRef.RelTableRef in project calcite by apache.

the class AbstractMaterializedViewRule method generateTableMappings.

/**
 * It will flatten a multimap containing table references to table references,
 * producing all possible combinations of mappings. Each of the mappings will
 * be bi-directional.
 */
private static List<BiMap<RelTableRef, RelTableRef>> generateTableMappings(Multimap<RelTableRef, RelTableRef> multiMapTables) {
    if (multiMapTables.isEmpty()) {
        return ImmutableList.of();
    }
    List<BiMap<RelTableRef, RelTableRef>> result = ImmutableList.<BiMap<RelTableRef, RelTableRef>>of(HashBiMap.<RelTableRef, RelTableRef>create());
    for (Entry<RelTableRef, Collection<RelTableRef>> e : multiMapTables.asMap().entrySet()) {
        if (e.getValue().size() == 1) {
            // Only one reference, we can just add it to every map
            RelTableRef target = e.getValue().iterator().next();
            for (BiMap<RelTableRef, RelTableRef> m : result) {
                m.put(e.getKey(), target);
            }
            continue;
        }
        // Multiple references: flatten
        ImmutableList.Builder<BiMap<RelTableRef, RelTableRef>> newResult = ImmutableList.builder();
        for (RelTableRef target : e.getValue()) {
            for (BiMap<RelTableRef, RelTableRef> m : result) {
                if (!m.containsValue(target)) {
                    final BiMap<RelTableRef, RelTableRef> newM = HashBiMap.<RelTableRef, RelTableRef>create(m);
                    newM.put(e.getKey(), target);
                    newResult.add(newM);
                }
            }
        }
        result = newResult.build();
    }
    return result;
}
Also used : ImmutableList(com.google.common.collect.ImmutableList) BiMap(com.google.common.collect.BiMap) HashBiMap(com.google.common.collect.HashBiMap) Collection(java.util.Collection) RelTableRef(org.apache.calcite.rex.RexTableInputRef.RelTableRef)

Aggregations

RelTableRef (org.apache.calcite.rex.RexTableInputRef.RelTableRef)16 RelNode (org.apache.calcite.rel.RelNode)12 List (java.util.List)9 RelOptPredicateList (org.apache.calcite.plan.RelOptPredicateList)8 RexNode (org.apache.calcite.rex.RexNode)8 HashMap (java.util.HashMap)7 ArrayList (java.util.ArrayList)6 HashSet (java.util.HashSet)6 RelMetadataQuery (org.apache.calcite.rel.metadata.RelMetadataQuery)6 RexBuilder (org.apache.calcite.rex.RexBuilder)6 LinkedHashSet (java.util.LinkedHashSet)5 RexTableInputRef (org.apache.calcite.rex.RexTableInputRef)5 Function (com.google.common.base.Function)4 ImmutableList (com.google.common.collect.ImmutableList)4 LinkedHashMap (java.util.LinkedHashMap)4 RelReferentialConstraint (org.apache.calcite.rel.RelReferentialConstraint)4 RexInputRef (org.apache.calcite.rex.RexInputRef)4 ImmutableBitSet (org.apache.calcite.util.ImmutableBitSet)4 Test (org.junit.Test)4 Set (java.util.Set)3