Is there anymore information I can give to help understand the missing rule?
Thank you! Eric On Tue, Aug 20, 2024 at 18:59 Eric Berryman <eric.berry...@gmail.com> wrote: > Is there something I’m missing about > EnumerableLimit? It seems like I get an infinite cost anytime it’s in my > path? > > Thank you again, > Eric > > On Mon, Aug 19, 2024 at 18:00 Eric Berryman <eric.berry...@gmail.com> > wrote: > >> I see the red circles in the svg query plan I added to the gist. I’m just >> not sure what it’s supposed to be telling me. >> >> Thank you! >> Eric >> >> On Mon, Aug 19, 2024 at 11:35 Eric Berryman <eric.berry...@gmail.com> >> wrote: >> >>> 1.37.0 >>> >>> On Mon, Aug 19, 2024 at 11:28 Ruben Q L <rube...@gmail.com> wrote: >>> >>>> Which Calcite version are you using? >>>> >>>> >>>> On Mon, Aug 19, 2024 at 4:22 PM Eric Berryman <eric.berry...@gmail.com> >>>> wrote: >>>> >>>> > I’ve noticed if I remove the limit, the EnumerableUnion works fine. >>>> So it >>>> > seems the infinite cost is coming from the EnumerableLimit outside of >>>> the >>>> > union. I have an LDAPSortLimit which is pushed past the union, and an >>>> > EnumerableLimit >>>> > is left outside the union, as you can see in the gist. >>>> > >>>> > On Mon, Aug 19, 2024 at 11:10 Eric Berryman <eric.berry...@gmail.com> >>>> > wrote: >>>> > >>>> > > Is there anymore information that would be helpful for me to give >>>> to aide >>>> > > in troubleshooting this? >>>> > > >>>> > > Thank you! >>>> > > Eric >>>> > > >>>> > > On Thu, Aug 15, 2024 at 16:51 Eric Berryman < >>>> eric.berry...@gmail.com> >>>> > > wrote: >>>> > > >>>> > >> >>>> > >> I seem to be struggling with unions still. Here is a gist with the >>>> > output >>>> > >> and svg of the plan. >>>> > >> >>>> > >> https://gist.github.com/berryma4/c4870dd4e292e0509d1c85c308b52e67 >>>> > >> >>>> > >> I need a little help on direction of what the svg is telling me. >>>> I see >>>> > >> the cost is infinite, but I don’t see where I’m missing a rule. >>>> > >> >>>> > >> >>>> > >> Thank you for your help, >>>> > >> Eric >>>> > >> >>>> > >> >>>> > >> >>>> > >> On Mon, Jul 29, 2024 at 18:28 Eric Berryman < >>>> eric.berry...@gmail.com> >>>> > >> wrote: >>>> > >> >>>> > >>> That didn't paste well. Here is a gist: >>>> > >>> https://gist.github.com/berryma4/c6c09da050f273295edd23c045c63403 >>>> > >>> >>>> > >>> >>>> > >>> >>>> > >>> On Mon, Jul 29, 2024 at 4:58 PM Eric Berryman < >>>> eric.berry...@gmail.com >>>> > > >>>> > >>> wrote: >>>> > >>> >>>> > >>>> I’m back from a long holiday, and seem stuck still on this >>>> scenario. >>>> > >>>> The plan gets created without any issues, but I get this error >>>> while >>>> > >>>> executing queries with unions. >>>> > >>>> >>>> > >>>> Thank you again! >>>> > >>>> Eric >>>> > >>>> >>>> > >>>> Here is the plan dump and error after running >>>> > >>>> relRunner.prepareStatement. >>>> > >>>> >>>> > >>>> EnumerableProject(UserObject=[$0], id=[$3]): rowcount = 30.0, >>>> > >>>> cumulative cost = {146.0 rows, 1393.2 cpu, 0.0 io}, id = 213 >>>> > >>>> EnumerableLimit(fetch=[100]): rowcount = 30.0, cumulative cost = >>>> > {116.0 >>>> > >>>> rows, 1333.2 cpu, 0.0 io}, id = 212 EnumerableUnion(all=[true]): >>>> > rowcount = >>>> > >>>> 30.0, cumulative cost = {86.0 rows, 1303.2 cpu, 0.0 io}, id = 211 >>>> > >>>> EnumerableProject(UserObject=[$0], id=[$3]): rowcount = 15.0, >>>> > cumulative >>>> > >>>> cost = {28.0 rows, 636.6 cpu, 0.0 io}, id = 207 >>>> > LDAPToEnumerableConverter: >>>> > >>>> rowcount = 15.0, cumulative cost = {13.0 rows, 21.6 cpu, 0.0 >>>> io}, id >>>> > = 206 >>>> > >>>> LDAPFilter(condition=[=(UPPER($5), 'RUDD')]): rowcount = 15.0, >>>> > cumulative >>>> > >>>> cost = {11.5 rows, 20.1 cpu, 0.0 io}, id = 205 >>>> > >>>> LDAPTableScan(table=[[SCIMUserSchema, cap_internet_ddpmildap]]): >>>> > rowcount = >>>> > >>>> 100.0, cumulative cost = {10.0 rows, 10.100000000000001 cpu, 0.0 >>>> io}, >>>> > id = >>>> > >>>> 0 EnumerableProject(UserObject=[$0], id=[$3]): rowcount = 15.0, >>>> > cumulative >>>> > >>>> cost = {28.0 rows, 636.6 cpu, 0.0 io}, id = 210 >>>> > LDAPToEnumerableConverter: >>>> > >>>> rowcount = 15.0, cumulative cost = {13.0 rows, 21.6 cpu, 0.0 >>>> io}, id >>>> > = 209 >>>> > >>>> LDAPFilter(condition=[=(UPPER($5), 'RUDD')]): rowcount = 15.0, >>>> > cumulative >>>> > >>>> cost = {11.5 rows, 20.1 cpu, 0.0 io}, id = 208 >>>> > >>>> LDAPTableScan(table=[[SCIMUserSchema, prov_internet_ddpmildap]]): >>>> > rowcount >>>> > >>>> = 100.0, cumulative cost = {10.0 rows, 10.100000000000001 cpu, >>>> 0.0 >>>> > io}, id >>>> > >>>> = 2 >>>> > >>>> >>>> > >>>> java.lang.AssertionError: null at >>>> > >>>> >>>> > >>>> org.apache.calcite.adapter.enumerable.EnumerableLimit.<init>(EnumerableLimit.java:60) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.adapter.enumerable.EnumerableLimit.copy(EnumerableLimit.java:84) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.adapter.enumerable.EnumerableLimit.copy(EnumerableLimit.java:43) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:378) >>>> > >>>> at >>>> > >>>> >>>> > >>>> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) >>>> > >>>> at java.base/java.lang.reflect.Method.invoke(Method.java:580) at >>>> > >>>> >>>> org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533) at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:286) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.RelFieldTrimmer.trimChild(RelFieldTrimmer.java:228) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.RelFieldTrimmer.trimFields(RelFieldTrimmer.java:514) >>>> > >>>> at >>>> > >>>> >>>> > >>>> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) >>>> > >>>> at java.base/java.lang.reflect.Method.invoke(Method.java:580) at >>>> > >>>> >>>> org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533) at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.RelFieldTrimmer.dispatchTrimFields(RelFieldTrimmer.java:286) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.RelFieldTrimmer.trim(RelFieldTrimmer.java:173) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.sql2rel.SqlToRelConverter.trimUnusedFields(SqlToRelConverter.java:567) >>>> > >>>> at >>>> > org.apache.calcite.prepare.Prepare.trimUnusedFields(Prepare.java:386) >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.prepare_(CalcitePrepareImpl.java:1061) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.prepareRel(CalcitePrepareImpl.java:1026) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:687) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:519) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:487) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:237) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement_(CalciteConnectionImpl.java:217) >>>> > >>>> at >>>> > >>>> >>>> > >>>> org.apache.calcite.jdbc.CalciteConnectionImpl.lambda$unwrap$0(CalciteConnectionImpl.java:187) >>>> > >>>> >>>> > >>>> >>>> > >>>> On Fri, Jul 19, 2024 at 11:07 Ruben Q L <rube...@gmail.com> >>>> wrote: >>>> > >>>> >>>> > >>>>> Eric, if you want to use EnumerableUnion instead of >>>> implementing your >>>> > >>>>> own >>>> > >>>>> Union, then I think you'll need to implement the appropriate >>>> > Converter >>>> > >>>>> [1] >>>> > >>>>> to transform between conventions LDAP <=> ENUMERABLE >>>> > >>>>> >>>> > >>>>> Best, >>>> > >>>>> Ruben >>>> > >>>>> >>>> > >>>>> [1] >>>> > >>>>> >>>> > >>>>> >>>> > >>>> https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/rel/convert/Converter.java >>>> > >>>>> >>>> > >>>>> >>>> > >>>>> On Fri, Jul 19, 2024 at 3:56 PM Eric Berryman < >>>> > eric.berry...@gmail.com >>>> > >>>>> > >>>> > >>>>> wrote: >>>> > >>>>> >>>> > >>>>> > I implement an LDAPUnion and rule to convert from >>>> logicalunion, and >>>> > >>>>> of >>>> > >>>>> > course, the error goes away. But I didn’t implement the union >>>> > >>>>> correctly, so >>>> > >>>>> > nothing is returned in my query. Is there a way to have my >>>> > LDAPUnion >>>> > >>>>> > use EnumerableUnion, >>>> > >>>>> > or a way to not have LDAPUnion and take care of this with a >>>> rule? >>>> > >>>>> > >>>> > >>>>> > Thank you again! >>>> > >>>>> > Eric >>>> > >>>>> > >>>> > >>>>> > On Tue, Jul 16, 2024 at 14:24 Eric Berryman < >>>> > eric.berry...@gmail.com >>>> > >>>>> > >>>> > >>>>> > wrote: >>>> > >>>>> > >>>> > >>>>> > > Well, I was wrong. That didn’t solve my problem with : >>>> > >>>>> > > >>>> > >>>>> > > Missing conversion is LogicalUnion[convention: NONE -> LDAP] >>>> > >>>>> > > >>>> > >>>>> > > Do I have to implement my own union? Is there a way I could >>>> just >>>> > >>>>> use the >>>> > >>>>> > > EnumerableUnion? >>>> > >>>>> > > ie. NONE -> Enumerable and skip implementing one for my ldap >>>> > >>>>> datastore? >>>> > >>>>> > > >>>> > >>>>> > > Thank you! >>>> > >>>>> > > Eric >>>> > >>>>> > > >>>> > >>>>> > > On Tue, Jul 16, 2024 at 09:00 Eric Berryman < >>>> > >>>>> eric.berry...@gmail.com> >>>> > >>>>> > > wrote: >>>> > >>>>> > > >>>> > >>>>> > >> When I register my tablescan object, and add my rules, I >>>> also >>>> > >>>>> added a >>>> > >>>>> > >> removeRule for >>>> EnumerableRules.ENUMERABLE_MERGE_UNION_RULE, and >>>> > >>>>> now >>>> > >>>>> > >> everything works with an offset also. >>>> > >>>>> > >> >>>> > >>>>> > >> Although, I don’t know why this is. I noticed the >>>> > >>>>> EnumerableMergeUnion >>>> > >>>>> > >> object in the plan, and thought I would try to remove it, >>>> > because >>>> > >>>>> it was >>>> > >>>>> > >> different. >>>> > >>>>> > >> >>>> > >>>>> > >> Any explanation is appreciated, thank you!!! >>>> > >>>>> > >> Eric >>>> > >>>>> > >> >>>> > >>>>> > >> >>>> > >>>>> > >> On Mon, Jul 15, 2024 at 18:02 Eric Berryman < >>>> > >>>>> eric.berry...@gmail.com> >>>> > >>>>> > >> wrote: >>>> > >>>>> > >> >>>> > >>>>> > >>> Hello! >>>> > >>>>> > >>> >>>> > >>>>> > >>> I seem to have an issue with my new limit rule which >>>> pushes >>>> > down >>>> > >>>>> to the >>>> > >>>>> > >>> datastore. It works fine, unless I add an offset to the >>>> fetch. >>>> > >>>>> Where I >>>> > >>>>> > end >>>> > >>>>> > >>> up with the following error: >>>> > >>>>> > >>> There are not enough rules… Missing conversion is >>>> > >>>>> > >>> LogicalUnion[convention: NONE -> LDAP] >>>> > >>>>> > >>> >>>> > >>>>> > >>> Why would this only come up when an offset value is added? >>>> > >>>>> > >>> >>>> > >>>>> > >>> Thank you! >>>> > >>>>> > >>> Eric >>>> > >>>>> > >>> >>>> > >>>>> > >>> >>>> > >>>>> > >>> On Fri, Jun 21, 2024 at 09:25 Eric Berryman < >>>> > >>>>> eric.berry...@gmail.com> >>>> > >>>>> > >>> wrote: >>>> > >>>>> > >>> >>>> > >>>>> > >>>> That’s perfect >>>> > >>>>> > >>>> >>>> > >>>>> > >>>> >>>> > >>>>> > >>>> > >>>>> >>>> > >>>> https://github.com/apache/calcite/blob/main/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java#L401 >>>> > >>>>> > >>>> >>>> > >>>>> > >>>> Thank you for such a quick response! >>>> > >>>>> > >>>> Eric >>>> > >>>>> > >>>> >>>> > >>>>> > >>>> >>>> > >>>>> > >>>> On Fri, Jun 21, 2024 at 09:14 Michael Mior < >>>> mm...@apache.org> >>>> > >>>>> wrote: >>>> > >>>>> > >>>> >>>> > >>>>> > >>>>> Eric, >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>>> Could you give a more specific example of the failure >>>> > scenario >>>> > >>>>> you're >>>> > >>>>> > >>>>> experiencing? >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>>> For a simple example of how limits can be pushed down, >>>> this >>>> > is >>>> > >>>>> done >>>> > >>>>> > in >>>> > >>>>> > >>>>> the >>>> > >>>>> > >>>>> Cassandra adapter with CassandraLimitRule. It matches an >>>> > >>>>> > >>>>> EnumerableLimit on >>>> > >>>>> > >>>>> top of a CassandraToEnumerableConverter and then >>>> converts >>>> > that >>>> > >>>>> limit >>>> > >>>>> > >>>>> to a >>>> > >>>>> > >>>>> CassandraLimit which passes along the limit and offset >>>> > >>>>> information to >>>> > >>>>> > >>>>> CassandraToEnumerableConverter for when the query is >>>> > executed. >>>> > >>>>> The >>>> > >>>>> > >>>>> EnumerableLimit is then replaced with a CassandraLimit >>>> > >>>>> effectively >>>> > >>>>> > as a >>>> > >>>>> > >>>>> placeholder to signal that the limit has been handled. >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>>> -- >>>> > >>>>> > >>>>> Michael Mior >>>> > >>>>> > >>>>> mm...@apache.org >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>>> On Fri, Jun 21, 2024 at 8:44 AM Eric Berryman < >>>> > >>>>> > eric.berry...@gmail.com >>>> > >>>>> > >>>>> > >>>> > >>>>> > >>>>> wrote: >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>>> > Hello! >>>> > >>>>> > >>>>> > >>>> > >>>>> > >>>>> > When I add limit to my relbuilder object, the planner >>>> gives >>>> > >>>>> up. But >>>> > >>>>> > >>>>> works >>>> > >>>>> > >>>>> > fine without it. >>>> > >>>>> > >>>>> > >>>> > >>>>> > >>>>> > I wasn’t able to find any examples of using limit and >>>> > >>>>> pushing the >>>> > >>>>> > >>>>> limit >>>> > >>>>> > >>>>> > values down to a data source. >>>> > >>>>> > >>>>> > >>>> > >>>>> > >>>>> > Could someone help with some links on this subject? >>>> > >>>>> > >>>>> > >>>> > >>>>> > >>>>> > Thank you! >>>> > >>>>> > >>>>> > Eric >>>> > >>>>> > >>>>> > >>>> > >>>>> > >>>>> >>>> > >>>>> > >>>> >>>> > >>>>> > >>>> > >>>>> >>>> > >>>> >>>> > >>>> >>>