Thank you, it worked with the Statistic object.

2016-09-26 19:45 GMT+03:00 [email protected] <
[email protected]>:

> I think you should just be able to override getStatistic() in your table
> implementations and return a Statistic object that has an accurate row
> count. The table scan should compute its cost from that, and uses 100d as a
> default IIRC.
>
> > On Sep 25, 2016, at 1:56 PM, Γιώργος Θεοδωράκης <[email protected]>
> wrote:
> >
> > I believe it has to do with the implementation of my tables, as I get
> fixed
> > numbers:
> > 1)select * from products => Rows:100
> > 2)select * from products where productid > 5 => Rows:50
> > 3)select * from products where productid = 5 => Rows:25 (and the exact
> same
> > numbers for the table orders)
> >
> > How can I define a table that gives back correct metadata for the rows?
> > Right now my tables implement ScannableTable.
> >
> >
> >
> > 2016-09-24 21:15 GMT+03:00 Γιώργος Θεοδωράκης <[email protected]>:
> >
> >> Hello,
> >>
> >> I am using a HepPlanner for query optimization on logical operators.
> When
> >> I run the optimizations, I get an optimized plan according to the rules
> I
> >> have used but wrong metadata results. My code is :
> >>
> >> SqlNode sqlNode = planner.parse(query);
> >> SqlNode validatedSqlNode = planner.validate(sqlNode);
> >> final RelNode convertedNode = planner.convert(validatedSqlNode);
> >> final RelMetadataProvider provider = convertedNode.getCluster().
> >> getMetadataProvider();
> >>
> >> final List<RelMetadataProvider> list = Lists.newArrayList(provider);
> >> hepPlanner.registerMetadataProviders(list);
> >> final RelMetadataProvider cachingMetaDataProvider = new
> >> CachingRelMetadataProvider(ChainedRelMetadataProvider.of(list),
> >> hepPlanner);
> >> convertedNode.accept(new MetaDataProviderModifier(
> >> cachingMetaDataProvider));
> >>
> >> hepPlanner.setRoot(convertedNode);
> >> RelNode rel = hepPlanner.findBestExp(); // when I print the logical plan
> >> it is correct
> >> rel.accept(new MetaDataProviderModifier(provider));
> >>
> >> final RelMetadataQuery mq = RelMetadataQuery.instance();
> >> RelOptCost relCost= mq.getCumulativeCost(rel);
> >> System.out.println("Plan cost is : " + relCost.toString()); //when I
> print
> >> the cost I get //a fixed number that has nothing to do with the actual
> size
> >> of my tables
> >>
> >>
> >> I always get the same numbers from cumulative cost, even if I change the
> >> contents of my tables for the same query. However, the numbers change
> >> before an after optimizing the query, but are still very large.What am I
> >> doing wrong?
> >>
> >> Thank you in advance,
> >> George
> >>
>

Reply via email to