ignite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dmitriy Setrakyan <dsetrak...@gridgain.com>
Subject Re: Enums and SQL queries
Date Wed, 27 Jul 2016 19:51:39 GMT
Sorry, Sergi. What I meant is to file a ticket with the design you suggested

Dmitriy



> On Jul 27, 2016, at 9:18 AM, Sergi Vladykin <sergi.vladykin@gmail.com> wrote:
> 
> I don't see how this can work to file a ticket, could you please give more
> details?
> 
> Sergi
> 
> 2016-07-27 15:50 GMT+03:00 Dmitriy Setrakyan <dsetrakyan@apache.org>:
> 
>> Sergi, I still thinks my solution works or can be made to work. In the
>> example you provided, you can choose to return either String or Enum as the
>> query result. However, this is not a clean solution, I agree, but could be
>> a quick one.
>> 
>> I don't mind breaking compatibility on this issue, given that it never
>> worked properly anyway. Can you please file a ticket?
>> 
>> D.
>> 
>> On Wed, Jul 27, 2016 at 3:01 AM, Sergi Vladykin <sergi.vladykin@gmail.com>
>> wrote:
>> 
>>> Nope. This will not work. Because take for example the following query:
>>> 
>>> select my_enum_field from my_table where my_enum_field = 'BLA'
>>> 
>>> Field well be evaluated only once here, but it must be a Sting and Enum
>> at
>>> the same time.
>> 
>> 
>>> Probably we could contribute to H2 `User defined value types` and handle
>>> this stuff in our own Enum value types, which will support comparison
>> with
>>> String. But this requires bug H2 Modification and is a compatibility
>>> breaking change.
>>> 
>>> Sergi
>>> 
>>> 
>>> 
>>> 2016-07-27 9:23 GMT+03:00 Dmitriy Setrakyan <dsetrakyan@apache.org>:
>>> 
>>>> Hm... I would prefer to find a way to handle Enums automatically.
>>>> 
>>>> In case if user expects a String, can we catch an exception and do
>>>> automatic conversion at that time? In this case, we could catch the
>>>> exception once and remember the decision. Will something like this
>> work?
>>>> 
>>>> D.
>>>> 
>>>> On Tue, Jul 26, 2016 at 1:49 AM, Sergi Vladykin <
>>> sergi.vladykin@gmail.com>
>>>> wrote:
>>>> 
>>>>> GridQueryProcessor contains two types: BinaryProperty and
>>> ClassProperty.
>>>>> Indexing uses them for fields access. Probably we can change them, so
>>>> that
>>>>> they will always return String instead of Enum type but this
>>>>> 
>>>>> 1. looks like a compatibility breaking change;
>>>>> 2. users doing queries like `select my_enum_field from my_table`
>>> probably
>>>>> still expect to get a Enum result but not a String.
>>>>> 
>>>>> What do you think?
>>>>> 
>>>>> Sergi
>>>>> 
>>>>> 
>>>>> 2016-07-26 3:17 GMT+03:00 Valentin Kulichenko <
>>>>> valentin.kulichenko@gmail.com
>>>>>> :
>>>>> 
>>>>>> Sergi,
>>>>>> 
>>>>>> Ideally, I would like this query to work:
>>>>>> 
>>>>>> select * from MyTable where myEnumField = 'MY_ENUM_NAME'
>>>>>> 
>>>>>> The problem is that the field value is not a string, it's a binary
>>>> object
>>>>>> with the enum value ordinal inside. We can add enum value names
>> into
>>>> the
>>>>>> metadata, so that we can always map the field value to its string
>>>>>> representation, but SQL engine will have to know how to use it. Is
>>> this
>>>>>> possible?
>>>>>> 
>>>>>> -Val
>>>>>> 
>>>>>> On Fri, Jul 22, 2016 at 10:25 PM, Sergi Vladykin <
>>>>> sergi.vladykin@gmail.com
>>>>>>> wrote:
>>>>>> 
>>>>>>> I'm not sure what exactly you are going to patch in SQL engine.
We
>>>> could
>>>>>>> and some SQL function like enum('MY_ENUM_NAME') but probably
it
>> will
>>>> not
>>>>>>> work if we will not pass enum type there as well, so it have
look
>>> like
>>>>>>> enum('com.mycompany.MyEnum', 'MY_ENUM_NAME') which is ugly.
>>>>>>> 
>>>>>>> Sergi
>>>>>>> 
>>>>>>> On 23 июля 2016 г., 0:43, Valentin Kulichenko <
>>>>>>> valentin.kulichenko@gmail.com
>>>>>>>> wrote:
>>>>>>> 
>>>>>>>> Folks,
>>>>>>>> 
>>>>>>>> I noticed that we currently have a very weird limitation
for
>> enum
>>>>> fields
>>>>>>>> when running SQL queries. Basically, you can't use enum value
>>> names
>>>> as
>>>>>>> many
>>>>>>>> users would expect.
>>>>>>>> 
>>>>>>>> Technically this happens because binary format stores only
>> ordinal
>>>> and
>>>>>>> the
>>>>>>>> only way to run such query is to do something like this:
>>>>>>>> 
>>>>>>>> SqlFieldsQuery qry = new SqlFieldsQuery("select * from Table
>> where
>>>>>>>> enumField = ?");
>>>>>>>> qry.setArgs(MyEnum.ENUM_VALUE);
>>>>>>>> cache.query(qry);
>>>>>>>> 
>>>>>>>> This means that this query can be executed only if:
>>>>>>>> - IgniteCache API is used. So it doesn't work in JDBC driver,
>>>>> Zeppelin,
>>>>>>>> etc.
>>>>>>>> - The client that executes the query has the enum class on
>>>> classpath.
>>>>>>>> 
>>>>>>>> My first thought about fixing this is to somehow store value
>> names
>>>> in
>>>>>>>> binary metadata and patch the SQL engine so that it understands
>>> how
>>>> to
>>>>>>> use
>>>>>>>> this information.
>>>>>>>> 
>>>>>>>> Thoughts?
>>>>>>>> 
>>>>>>>> -Val
>> 

Mime
View raw message