Julian, > Do you need to generate a different plan (i.e. a different tree of RelNodes) > for scrolling vs non-scrolling? The plan is same. I just need to construct a different ES query and batching Enumerator
On Thu, Oct 25, 2018 at 1:31 PM Julian Hyde <jh...@apache.org> wrote: > > Do you need to generate a different plan (i.e. a different tree of RelNodes) > for scrolling vs non-scrolling? If so, it’s certainly inconvenient that you > don’t know until execute time whether they want scrolling. A possible > solution would be to generate TWO plans - one scrolling, one non-scrolling > inside the prepared statement - and pick which one based on the runtime > context. > > Julian > > > On Oct 25, 2018, at 1:42 AM, Christian Beikov <christian.bei...@gmail.com> > > wrote: > > > > Hey Andrei, > > > > I don't have an answer for how you can access these settings from within > > the adapter nor how one could do that via RelNodes but the suggestion to > > use DataContext for that purpose sounds reasonable. Maybe someone else has > > an idea? > > > > Anyway, since these are settings that don't affect the general semantics of > > the query/statement and also usually require a special API to be used, I'd > > rather see these aspects not end up in the query string. > > > > Am 25.10.2018 um 02:15 schrieb Andrei Sereda: > >> Christian, > >> > >> I like TYPE_SCROLL_INSENSITIVE / fetchSize in PreparedStatement > >> generally but have some reservations (questions) : > >> > >> How to pass resultSetType / fetchSize from PreparedStatement to RelNodes ? > >> What if user doesn’t use JDBC (eg. RelBuilders) ? > >> On Wed, Oct 24, 2018 at 6:28 PM Christian Beikov > >> <christian.bei...@gmail.com> wrote: > >>> In JDBC one can configure a fetch size which would reflect the amount of > >>> rows to be fetched initially, but also subsequently. > >>> https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize(int) > >>> > >>> According to what you are writing, ES behvior is what > >>> TYPE_SCROLL_INSENSITIVE would do i.e. provide a snapshot view that isn't > >>> affected by changes. > >>> > >>> IMO TYPE_SCROLL_SENSITIVE means that if you have rows R1, R2, R3, R4, > >>> ... and view R1, R2, then R3 is deleted and you fetch the next rows, you > >>> wouldn't see R3. > >>> > >>> According to the JDBC spec > >>> (https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#prepareStatement(java.lang.String,%20int,%20int) > >>> ) you don't have to support all modes. Usually, user code doesn't use > >>> scrolling that much, but at least forward scrolling makes sense. > >>> > >>> Am 24.10.2018 um 21:38 schrieb Andrei Sereda: > >>>> Hi Julian, > >>>> > >>>> Scrolling (in elastic) does not only mean “open a cursor” but also > >>>> iterate > >>>> over consistent snapshot. From docs: > >>>> > >>>> The results that are returned from a scroll request reflect the state of > >>>> the index at the time that the initial search request was made, like a > >>>> snapshot in time. Subsequent changes to documents (index, update or > >>>> delete) > >>>> will only affect later search requests. > >>>> > >>>> So pagination (fetch / offset) can’t exactly replicate this > >>>> functionality. > >>>> > >>>> The problem with scrolling (in elastic) is that it is expensive and can’t > >>>> (shouldn’t) be enabled it by default. > >>>> > >>>> There is one more “issue”. Currently select * from elastic returns at > >>>> most > >>>> 10 rows (in calcite). This is consistent with elastic behaviour which > >>>> limits result set to 10 documents (unless size is specified). When > >>>> returning a cursor (eg. using JDBC TYPE_SCROLL_SENSITIVE > >>>> <https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#TYPE_SCROLL_SENSITIVE> > >>>> or SQL hint) does it mean return whole elastic index ? I’m not at ease > >>>> with > >>>> returning different results based on hints or cursor settings. > >>>> > >>>> Andrei. > >>>> > >>>> On Wed, Oct 24, 2018 at 3:02 PM Julian Hyde <jhyde.apa...@gmail.com> > >>>> wrote: > >>>> > >>>>> It seems to me that Elasticsearch scroll means return a cursor - a > >>>>> collection of rows that you iterate over, and you may not read all of > >>>>> them. > >>>>> This is the default operation of JDBC. > >>>>> > >>>>> So, I guess we need to give the user a way to signal their intent to > >>>>> read > >>>>> all rows versus only the first few. Oracle’s FIRST_ROWS and ALL_ROWS > >>>>> hints[1] seem close to this. We would want the hints to be acted upon by > >>>>> both the optimizer and the JDBC transport. > >>>>> > >>>>> Related is pagination. SQL has FETCH and OFFSET, which allow you to > >>>>> retrieve different pieces of a large result set in separate statements > >>>>> or > >>>>> (using query parameters) executions. It would be useful if the server > >>>>> could > >>>>> be given a hint to cache a statement across page requests. > >>>>> > >>>>> Julian > >>>>> > >>>>> [1] > >>>>> https://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#4924 > >>>>> > >>>>>> On Oct 24, 2018, at 11:19 AM, Christian Beikov < > >>>>> christian.bei...@gmail.com> wrote: > >>>>>> Hey, > >>>>>> > >>>>>> not sure if this should be an SQL keyword. JDBC specifies various > >>>>> constants that can be used at statement creation time: > >>>>> https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html > >>>>>> Not sure though if or how these configurations are accessible for data > >>>>> stores or dialects, but IMO using these would be the proper way. > >>>>>> Regards > >>>>>> > >>>>>> Christian > >>>>>> > >>>>>>> Am 24.10.2018 um 18:44 schrieb Andrei Sereda: > >>>>>>> Hello, > >>>>>>> > >>>>>>> > >>>>>>> I was thinking about adding [scrolling functionality]( > >>>>>>> > >>>>> https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html > >>>>> ) > >>>>>>> to elastic search adapter. Since scrolling has non-negligible effect > >>>>>>> on > >>>>> the > >>>>>>> cluster it should be selectively enabled on per query basis. So, > >>>>>>> likely, > >>>>>>> user has to explicitly set "scroll flag" somewhere. > >>>>>>> > >>>>>>> Most natural way seems in SQL. [Calcite sql grammar]( > >>>>>>> https://calcite.apache.org/docs/reference.html) has `SCROLL` keyword > >>>>>>> (unused to my knowledge). There were also discussions about adding > >>>>> hints to > >>>>>>> Calcite. > >>>>>>> > >>>>>>> ### Examples > >>>>>>> ```sql > >>>>>>> -- special sql keyword ? > >>>>>>> SCROLL select * from elastic; > >>>>>>> > >>>>>>> -- assuming hints are available in calcite > >>>>>>> /* HINT: scroll */ select * from elastic; > >>>>>>> ``` > >>>>>>> > >>>>>>> What people think about this use-case ? Are there better ideas ? > >>>>>>> > >>>>>>> Regards, > >>>>>>> Andrei. > >>>>>>> >