Skip to content

Commit 64268b9

Browse files
[CALCITE-5944] Add metadata for Sample
- RelMdAllPredicates - RelMdColumnOrigins - RelMdExpressionLineage - RelMdMaxRowCount - RelMdMinRowCount - RelMdPredicates - RelMdRowCount
1 parent 4e6c403 commit 64268b9

15 files changed

+119
-0
lines changed

core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.calcite.rel.core.Filter;
2828
import org.apache.calcite.rel.core.Join;
2929
import org.apache.calcite.rel.core.Project;
30+
import org.apache.calcite.rel.core.Sample;
3031
import org.apache.calcite.rel.core.SetOp;
3132
import org.apache.calcite.rel.core.Sort;
3233
import org.apache.calcite.rel.core.TableModify;
@@ -345,6 +346,14 @@ public class RelMdAllPredicates
345346
return newPreds;
346347
}
347348

349+
/**
350+
* Extracts predicates for a Sample.
351+
*/
352+
public @Nullable RelOptPredicateList getAllPredicates(Sample sample,
353+
RelMetadataQuery mq) {
354+
return mq.getAllPredicates(sample.getInput());
355+
}
356+
348357
/**
349358
* Extracts predicates for a Sort.
350359
*/

core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.calcite.rel.core.Filter;
2626
import org.apache.calcite.rel.core.Join;
2727
import org.apache.calcite.rel.core.Project;
28+
import org.apache.calcite.rel.core.Sample;
2829
import org.apache.calcite.rel.core.SetOp;
2930
import org.apache.calcite.rel.core.Snapshot;
3031
import org.apache.calcite.rel.core.Sort;
@@ -195,6 +196,11 @@ private RelMdColumnOrigins() {}
195196
return mq.getColumnOrigins(rel.getInput(), iOutputColumn);
196197
}
197198

199+
public @Nullable Set<RelColumnOrigin> getColumnOrigins(Sample rel,
200+
RelMetadataQuery mq, int iOutputColumn) {
201+
return mq.getColumnOrigins(rel.getInput(), iOutputColumn);
202+
}
203+
198204
public @Nullable Set<RelColumnOrigin> getColumnOrigins(Snapshot rel,
199205
RelMetadataQuery mq, int iOutputColumn) {
200206
return mq.getColumnOrigins(rel.getInput(), iOutputColumn);

core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.calcite.rel.core.Join;
2727
import org.apache.calcite.rel.core.JoinRelType;
2828
import org.apache.calcite.rel.core.Project;
29+
import org.apache.calcite.rel.core.Sample;
2930
import org.apache.calcite.rel.core.Snapshot;
3031
import org.apache.calcite.rel.core.Sort;
3132
import org.apache.calcite.rel.core.TableModify;
@@ -394,6 +395,14 @@ protected RelMdExpressionLineage() {}
394395
return mq.getExpressionLineage(rel.getInput(), outputExpression);
395396
}
396397

398+
/**
399+
* Expression lineage from Sample.
400+
*/
401+
public @Nullable Set<RexNode> getExpressionLineage(Sample rel,
402+
RelMetadataQuery mq, RexNode outputExpression) {
403+
return mq.getExpressionLineage(rel.getInput(), outputExpression);
404+
}
405+
397406
/**
398407
* Expression lineage from Snapshot.
399408
*

core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.calcite.rel.core.Join;
2929
import org.apache.calcite.rel.core.Minus;
3030
import org.apache.calcite.rel.core.Project;
31+
import org.apache.calcite.rel.core.Sample;
3132
import org.apache.calcite.rel.core.Sort;
3233
import org.apache.calcite.rel.core.TableModify;
3334
import org.apache.calcite.rel.core.TableScan;
@@ -104,6 +105,10 @@ public class RelMdMaxRowCount
104105
return mq.getMaxRowCount(rel.getInput());
105106
}
106107

108+
public @Nullable Double getMaxRowCount(Sample rel, RelMetadataQuery mq) {
109+
return mq.getMaxRowCount(rel.getInput());
110+
}
111+
107112
public Double getMaxRowCount(Sort rel, RelMetadataQuery mq) {
108113
Double rowCount = mq.getMaxRowCount(rel.getInput());
109114
if (rowCount == null) {

core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.calcite.rel.core.Join;
2828
import org.apache.calcite.rel.core.Minus;
2929
import org.apache.calcite.rel.core.Project;
30+
import org.apache.calcite.rel.core.Sample;
3031
import org.apache.calcite.rel.core.Sort;
3132
import org.apache.calcite.rel.core.TableModify;
3233
import org.apache.calcite.rel.core.TableScan;
@@ -103,6 +104,10 @@ public Double getMinRowCount(Filter rel, RelMetadataQuery mq) {
103104
return mq.getMinRowCount(rel.getInput());
104105
}
105106

107+
public @Nullable Double getMinRowCount(Sample rel, RelMetadataQuery mq) {
108+
return mq.getMinRowCount(rel.getInput());
109+
}
110+
106111
public Double getMinRowCount(Sort rel, RelMetadataQuery mq) {
107112
Double rowCount = mq.getMinRowCount(rel.getInput());
108113
if (rowCount == null) {

core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.calcite.rel.core.JoinRelType;
3535
import org.apache.calcite.rel.core.Minus;
3636
import org.apache.calcite.rel.core.Project;
37+
import org.apache.calcite.rel.core.Sample;
3738
import org.apache.calcite.rel.core.Sort;
3839
import org.apache.calcite.rel.core.TableModify;
3940
import org.apache.calcite.rel.core.TableScan;
@@ -500,6 +501,13 @@ public RelOptPredicateList getPredicates(Minus minus, RelMetadataQuery mq) {
500501
return mq.getPulledUpPredicates(minus.getInput(0));
501502
}
502503

504+
/**
505+
* Infers predicates for a Sample.
506+
*/
507+
public RelOptPredicateList getPredicates(Sample sample, RelMetadataQuery mq) {
508+
RelNode input = sample.getInput();
509+
return mq.getPulledUpPredicates(input);
510+
}
503511

504512
/**
505513
* Infers predicates for a Sort.

core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.calcite.rel.core.Join;
2929
import org.apache.calcite.rel.core.Minus;
3030
import org.apache.calcite.rel.core.Project;
31+
import org.apache.calcite.rel.core.Sample;
3132
import org.apache.calcite.rel.core.Sort;
3233
import org.apache.calcite.rel.core.TableModify;
3334
import org.apache.calcite.rel.core.TableScan;
@@ -169,6 +170,12 @@ public Double getRowCount(Calc rel, RelMetadataQuery mq) {
169170
return limit < rowCount ? limit : rowCount;
170171
}
171172

173+
public @Nullable Double getRowCount(Sample rel, RelMetadataQuery mq) {
174+
final Double inputRowCount = mq.getRowCount(rel.getInput());
175+
final double sampleRate = rel.getSamplingParameters().sampleRate.doubleValue();
176+
return sampleRate * inputRowCount;
177+
}
178+
172179
// Covers Converter, Interpreter
173180
public @Nullable Double getRowCount(SingleRel rel, RelMetadataQuery mq) {
174181
return mq.getRowCount(rel.getInput());

core/src/test/java/org/apache/calcite/test/RelMetadataTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,16 @@ final RelMetadataFixture sql(String sql) {
357357
.assertColumnOriginSingle("DEPT", "NAME", true);
358358
}
359359

360+
/** Test case for
361+
* <a href="https://issues.apache.org/jira/browse/CALCITE-5944">[CALCITE-5944]
362+
* Add metadata for Sample</a>. */
363+
@Test void testColumnOriginsSample() {
364+
final String sql = "select productid from products_temporal\n"
365+
+ "tablesample bernoulli(50) repeatable(1)";
366+
sql(sql)
367+
.assertColumnOriginSingle("PRODUCTS_TEMPORAL", "PRODUCTID", false);
368+
}
369+
360370
@Test void testColumnOriginsSnapshot() {
361371
final String sql = "select productid from products_temporal\n"
362372
+ "for system_time as of TIMESTAMP '2011-01-02 00:00:00'";
@@ -700,6 +710,16 @@ final RelMetadataFixture sql(String sql) {
700710
sql(sql).assertThatRowCount(is(7d), is(0D), is(7d));
701711
}
702712

713+
/** Test case for
714+
* <a href="https://issues.apache.org/jira/browse/CALCITE-5944">[CALCITE-5944]
715+
* Add metadata for Sample</a>. */
716+
@Test void testRowCountSample() {
717+
sql("select * from emp tablesample bernoulli(50) repeatable(1)")
718+
.assertThatRowCount(is(EMP_SIZE * 0.5), is(0D), is(Double.POSITIVE_INFINITY));
719+
sql("select * from emp tablesample system(20)")
720+
.assertThatRowCount(is(EMP_SIZE * 0.2), is(0D), is(Double.POSITIVE_INFINITY));
721+
}
722+
703723
@Test void testRowCountAggregate() {
704724
final String sql = "select deptno from emp group by deptno";
705725
sql(sql).assertThatRowCount(is(1.4D), is(0D), is(Double.POSITIVE_INFINITY));
@@ -2232,6 +2252,19 @@ private void checkPredicates(RelOptCluster cluster, RelOptTable empTable,
22322252
sortsAs("[=($0, 1), =($1, 2)]"));
22332253
}
22342254

2255+
/** Test case for
2256+
* <a href="https://issues.apache.org/jira/browse/CALCITE-5944">[CALCITE-5944]
2257+
* Add metadata for Sample</a>. */
2258+
@Test void testPullUpPredicatesFromSample() {
2259+
final RelNode rel = sql("select * from("
2260+
+ "select empno, deptno, comm from emp\n"
2261+
+ "where empno=1 and deptno=2)\n"
2262+
+ "tablesample bernoulli(50) repeatable(1)").toRel();
2263+
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
2264+
assertThat(mq.getPulledUpPredicates(rel).pulledUpPredicates,
2265+
sortsAs("[=($0, 1), =($1, 2)]"));
2266+
}
2267+
22352268
@Test void testDistributionSimple() {
22362269
RelNode rel = sql("select * from emp where deptno = 10").toRel();
22372270
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
@@ -2296,6 +2329,16 @@ private void assertExpressionLineage(
22962329
String.valueOf(r), is(expected));
22972330
}
22982331

2332+
/** Test case for
2333+
* <a href="https://issues.apache.org/jira/browse/CALCITE-5944">[CALCITE-5944]
2334+
* Add metadata for Sample</a>. */
2335+
@Test void testExpressionLineageSample() {
2336+
final String sql = "select productid from products_temporal\n"
2337+
+ "tablesample bernoulli(50) repeatable(1)";
2338+
final String expected = "[[CATALOG, SALES, PRODUCTS_TEMPORAL].#0.$0]";
2339+
final String comment = "'productid' is column 0 in 'catalog.sales.products_temporal'";
2340+
assertExpressionLineage(sql, 0, expected, comment);
2341+
}
22992342

23002343
/** Test case for
23012344
* <a href="https://issues.apache.org/jira/browse/CALCITE-5392">[CALCITE-5392]
@@ -2863,6 +2906,19 @@ private void checkAllPredicates(RelOptCluster cluster, RelOptTable empTable,
28632906
checkAllPredicatesAndTableSetOp(sql);
28642907
}
28652908

2909+
/** Test case for
2910+
* <a href="https://issues.apache.org/jira/browse/CALCITE-5944">[CALCITE-5944]
2911+
* Add metadata for Sample</a>. */
2912+
@Test void testAllPredicatesSample() {
2913+
final RelNode rel = sql("select * from("
2914+
+ "select empno, deptno, comm from emp\n"
2915+
+ "where empno=1 and deptno=2)\n"
2916+
+ "tablesample bernoulli(50) repeatable(1)").toRel();
2917+
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
2918+
assertThat(mq.getAllPredicates(rel).pulledUpPredicates,
2919+
sortsAs("[AND(=([CATALOG, SALES, EMP].#0.$0, 1), =([CATALOG, SALES, EMP].#0.$7, 2))]"));
2920+
}
2921+
28662922
public void checkAllPredicatesAndTableSetOp(String sql) {
28672923
final RelNode rel = sql(sql).toRel();
28682924
final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();

core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_AllPredicatesHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ private org.apache.calcite.plan.RelOptPredicateList getAllPredicates_(
7676
return provider0.getAllPredicates((org.apache.calcite.rel.core.Join) r, mq);
7777
} else if (r instanceof org.apache.calcite.rel.core.Project) {
7878
return provider0.getAllPredicates((org.apache.calcite.rel.core.Project) r, mq);
79+
} else if (r instanceof org.apache.calcite.rel.core.Sample) {
80+
return provider0.getAllPredicates((org.apache.calcite.rel.core.Sample) r, mq);
7981
} else if (r instanceof org.apache.calcite.rel.core.SetOp) {
8082
return provider0.getAllPredicates((org.apache.calcite.rel.core.SetOp) r, mq);
8183
} else if (r instanceof org.apache.calcite.rel.core.Sort) {

core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_ColumnOriginHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ private java.util.Set getColumnOrigins_(
8080
return provider0.getColumnOrigins((org.apache.calcite.rel.core.Join) r, mq, a2);
8181
} else if (r instanceof org.apache.calcite.rel.core.Project) {
8282
return provider0.getColumnOrigins((org.apache.calcite.rel.core.Project) r, mq, a2);
83+
} else if (r instanceof org.apache.calcite.rel.core.Sample) {
84+
return provider0.getColumnOrigins((org.apache.calcite.rel.core.Sample) r, mq, a2);
8385
} else if (r instanceof org.apache.calcite.rel.core.SetOp) {
8486
return provider0.getColumnOrigins((org.apache.calcite.rel.core.SetOp) r, mq, a2);
8587
} else if (r instanceof org.apache.calcite.rel.core.Snapshot) {

0 commit comments

Comments
 (0)