private static boolean isKey(ImmutableBitSet c, RelNode rel, RelMetadataQuery mq) { boolean isKey = false; Set<ImmutableBitSet> keys = mq.getUniqueKeys(rel); if (keys != null) { for (ImmutableBitSet key : keys) { if (key.equals(c)) { isKey = true; break; } } } return isKey; }
mq.getUniqueKeys(rel.getInput(), ignoreNulls);
RelMetadataQuery mq = aggregate.getCluster().getMetadataQuery(); final Set<ImmutableBitSet> uniqueKeys = mq.getUniqueKeys(input, false); if (uniqueKeys == null || uniqueKeys.isEmpty()) { return generateGroupSetIfCardinalitySame(aggregate, originalGroupSet, fieldsUsed);
/** * Returns the * {@link BuiltInMetadata.UniqueKeys#getUniqueKeys(boolean)} * statistic. * * @param rel the relational expression * @return set of keys, or null if this information cannot be determined * (whereas empty set indicates definitely no keys at all) */ public Set<ImmutableBitSet> getUniqueKeys(RelNode rel) { return getUniqueKeys(rel, false); }
/** * Returns the * {@link BuiltInMetadata.UniqueKeys#getUniqueKeys(boolean)} * statistic. * * @param rel the relational expression * @return set of keys, or null if this information cannot be determined * (whereas empty set indicates definitely no keys at all) */ public Set<ImmutableBitSet> getUniqueKeys(RelNode rel) { return getUniqueKeys(rel, false); }
public Set<ImmutableBitSet> getUniqueKeys(SemiJoin rel, RelMetadataQuery mq, boolean ignoreNulls) { // only return the unique keys from the LHS since a semijoin only // returns the LHS return mq.getUniqueKeys(rel.getLeft(), ignoreNulls); }
public Set<ImmutableBitSet> getUniqueKeys(SemiJoin rel, RelMetadataQuery mq, boolean ignoreNulls) { // only return the unique keys from the LHS since a semijoin only // returns the LHS return mq.getUniqueKeys(rel.getLeft(), ignoreNulls); }
public Set<ImmutableBitSet> getUniqueKeys(Filter rel, RelMetadataQuery mq, boolean ignoreNulls) { return mq.getUniqueKeys(rel.getInput(), ignoreNulls); }
/** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-509">[CALCITE-509] * "RelMdColumnUniqueness uses ImmutableBitSet.Builder twice, gets * NullPointerException"</a>. */ @Test public void testJoinUniqueKeys() { RelNode rel = convertSql("select * from emp join bonus using (ename)"); final RelMetadataQuery mq = RelMetadataQuery.instance(); Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result.isEmpty(), is(true)); assertUniqueConsistent(rel); }
/** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-509">[CALCITE-509] * "RelMdColumnUniqueness uses ImmutableBitSet.Builder twice, gets * NullPointerException"</a>. */ @Test public void testJoinUniqueKeys() { RelNode rel = convertSql("select * from emp join bonus using (ename)"); final RelMetadataQuery mq = RelMetadataQuery.instance(); Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result.isEmpty(), is(true)); assertUniqueConsistent(rel); }
@Test public void testGroupByEmptyHavingUniqueKeys() { RelNode rel = convertSql("select count(*) from emp where 1 = 1"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of()))); assertUniqueConsistent(rel); }
@Test public void testGroupByEmptyUniqueKeys() { RelNode rel = convertSql("select count(*) from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of()))); assertUniqueConsistent(rel); }
@Test public void testUnion() { RelNode rel = convertSql("select deptno from emp\n" + "union\n" + "select deptno from dept"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of(0)))); assertUniqueConsistent(rel); }
@Test public void testUnion() { RelNode rel = convertSql("select deptno from emp\n" + "union\n" + "select deptno from dept"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of(0)))); assertUniqueConsistent(rel); }
@Test public void testGroupByEmptyUniqueKeys() { RelNode rel = convertSql("select count(*) from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of()))); assertUniqueConsistent(rel); }
@Test public void testGroupBy() { RelNode rel = convertSql("select deptno, count(*), sum(sal) from emp\n" + "group by deptno"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of(0)))); assertUniqueConsistent(rel); }
@Test public void testGroupBy() { RelNode rel = convertSql("select deptno, count(*), sum(sal) from emp\n" + "group by deptno"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of(0)))); assertUniqueConsistent(rel); }
@Test public void testGroupByEmptyHavingUniqueKeys() { RelNode rel = convertSql("select count(*) from emp where 1 = 1"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> result = mq.getUniqueKeys(rel); assertThat(result, CoreMatchers.equalTo( ImmutableSet.of(ImmutableBitSet.of()))); assertUniqueConsistent(rel); }
/** Asserts that {@link RelMetadataQuery#getUniqueKeys(RelNode)} * and {@link RelMetadataQuery#areColumnsUnique(RelNode, ImmutableBitSet)} * return consistent results. */ private void assertUniqueConsistent(RelNode rel) { final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> uniqueKeys = mq.getUniqueKeys(rel); final ImmutableBitSet allCols = ImmutableBitSet.range(0, rel.getRowType().getFieldCount()); for (ImmutableBitSet key : allCols.powerSet()) { Boolean result2 = mq.areColumnsUnique(rel, key); assertTrue(result2 == null || result2 == isUnique(uniqueKeys, key)); } }
/** Asserts that {@link RelMetadataQuery#getUniqueKeys(RelNode)} * and {@link RelMetadataQuery#areColumnsUnique(RelNode, ImmutableBitSet)} * return consistent results. */ private void assertUniqueConsistent(RelNode rel) { final RelMetadataQuery mq = RelMetadataQuery.instance(); final Set<ImmutableBitSet> uniqueKeys = mq.getUniqueKeys(rel); final ImmutableBitSet allCols = ImmutableBitSet.range(0, rel.getRowType().getFieldCount()); for (ImmutableBitSet key : allCols.powerSet()) { Boolean result2 = mq.areColumnsUnique(rel, key); assertTrue(result2 == null || result2 == isUnique(uniqueKeys, key)); } }