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

Reply via email to