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 > >> >
