Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ksqlDB table incorrectly returns window-based field as null in pull query #4015

Closed
rmoff opened this issue Dec 2, 2019 · 6 comments · Fixed by #4435
Closed

ksqlDB table incorrectly returns window-based field as null in pull query #4015

rmoff opened this issue Dec 2, 2019 · 6 comments · Fixed by #4435
Labels
Milestone

Comments

@rmoff
Copy link
Contributor

rmoff commented Dec 2, 2019

ksqlDB 0.6

Create table:

ksql> CREATE TABLE TWEET_LANG AS SELECT TIMESTAMPTOSTRING(WINDOWSTART(),'yyyy-MM-dd HH:mm:ss Z') AS WINDOW_TS, LANG, COUNT(*) AS TWEET_COUNT FROM ALL_TWEETS WINDOW TUMBLING (SIZE 5 MINUTES) GROUP BY LANG;

 Message
-----------------------------------------------------------------------------------------
 Table TWEET_LANG created and running. Created by query with query ID: CTAS_TWEET_LANG_9
-----------------------------------------------------------------------------------------
ksql>

Table:

ksql> describe EXTENDED TWEET_LANG;

Name                 : TWEET_LANG
Type                 : TABLE
Key field            : LANG
Key format           : STRING
Timestamp field      : Not set - using <ROWTIME>
Value format         : AVRO
Kafka topic          : TWEET_LANG (partitions: 1, replication: 1)

 Field       | Type
-----------------------------------------
 ROWTIME     | BIGINT           (system)
 ROWKEY      | VARCHAR(STRING)  (system)
 WINDOW_TS   | VARCHAR(STRING)
 LANG        | VARCHAR(STRING)
 TWEET_COUNT | BIGINT
-----------------------------------------

Queries that write from this TABLE
-----------------------------------
CTAS_TWEET_LANG_9 : CREATE TABLE TWEET_LANG WITH (KAFKA_TOPIC='TWEET_LANG', PARTITIONS=1, REPLICAS=1) AS SELECT
  TIMESTAMPTOSTRING(WINDOWSTART(), 'yyyy-MM-dd HH:mm:ss Z') WINDOW_TS,
  ALL_TWEETS.LANG LANG,
  COUNT(*) TWEET_COUNT
FROM ALL_TWEETS ALL_TWEETS
WINDOW TUMBLING ( SIZE 5 MINUTES )
GROUP BY ALL_TWEETS.LANG
EMIT CHANGES;

For query topology and execution plan please run: EXPLAIN <QueryId>

Local runtime statistics
------------------------
messages-per-sec:      0.52   total-messages:       386     last-message: 2019-12-02T17:43:19.256Z

(Statistics of the local KSQL server interaction with the Kafka topic TWEET_LANG)
ksql>

There's data:

ksql> SELECT * FROM TWEET_LANG EMIT CHANGES LIMIT 5;
+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
|ROWTIME                   |ROWKEY                    |WINDOW_TS                 |LANG                      |TWEET_COUNT               |
+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
|1575302990725             |und : Window{start=1575302|2019-12-02 16:05:00 +0000 |und                       |12                        |
|                          |700000 end=-}             |                          |                          |                          |
|1575302999705             |en : Window{start=15753027|2019-12-02 16:05:00 +0000 |en                        |303                       |
|                          |00000 end=-}              |                          |                          |                          |
|1575303261873             |und : Window{start=1575303|2019-12-02 16:10:00 +0000 |und                       |12                        |
|                          |000000 end=-}             |                          |                          |                          |
|1575303299592             |en : Window{start=15753030|2019-12-02 16:10:00 +0000 |en                        |507                       |
|                          |00000 end=-}              |                          |                          |                          |
|1575303321115             |fr : Window{start=15753033|2019-12-02 16:15:00 +0000 |fr                        |1                         |
|                          |00000 end=-}              |                          |                          |                          |
Limit Reached
Query terminated

✅ Select just some columns (PUSH):

ksql> SELECT WINDOW_TS, LANG, TWEET_COUNT FROM TWEET_LANG WHERE LANG='en' EMIT CHANGES;
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|WINDOW_TS                                    |LANG                                         |TWEET_COUNT                                  |
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|2019-12-02 16:05:00 +0000                    |en                                           |303                                          |
|2019-12-02 16:10:00 +0000                    |en                                           |507                                          |
|2019-12-02 16:15:00 +0000                    |en                                           |549                                          |
|2019-12-02 16:20:00 +0000                    |en                                           |498                                          |
|2019-12-02 16:25:00 +0000                    |en                                           |555                                          |
|2019-12-02 16:30:00 +0000                    |en                                           |539                                          |
|2019-12-02 16:35:00 +0000                    |en                                           |542                                          |
|2019-12-02 16:40:00 +0000                    |en                                           |534                                          |
|2019-12-02 16:45:00 +0000                    |en                                           |414                                          |
|2019-12-02 16:50:00 +0000                    |en                                           |9                                            |
|2019-12-02 16:55:00 +0000                    |en                                           |14                                           |
|2019-12-02 17:00:00 +0000                    |en                                           |22                                           |
|2019-12-02 17:05:00 +0000                    |en                                           |15                                           |
|2019-12-02 17:20:00 +0000                    |en                                           |591                                          |
|2019-12-02 17:10:00 +0000                    |en                                           |14                                           |
|2019-12-02 17:15:00 +0000                    |en                                           |84                                           |
|2019-12-02 17:25:00 +0000                    |en                                           |633                                          |
|2019-12-02 17:30:00 +0000                    |en                                           |633                                          |
|2019-12-02 17:35:00 +0000                    |en                                           |612                                          |
|2019-12-02 17:40:00 +0000                    |en                                           |587                                          |
|2019-12-02 17:45:00 +0000                    |en                                           |37                                           |
|2019-12-02 17:45:00 +0000                    |en                                           |39                                           |
^C|2019-12-02 17:45:00 +0000                    |en                                           |43                                           |
Query terminated
ksql>

⛔️ Select just some columns (PULL) - shows null for WINDOW_TS where should be a value

ksql> SELECT WINDOW_TS, LANG, TWEET_COUNT FROM TWEET_LANG WHERE ROWKEY='en';
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|WINDOW_TS                                    |LANG                                         |TWEET_COUNT                                  |
+---------------------------------------------+---------------------------------------------+---------------------------------------------+
|null                                         |en                                           |303                                          |
|null                                         |en                                           |507                                          |
|null                                         |en                                           |549                                          |
|null                                         |en                                           |498                                          |
|null                                         |en                                           |555                                          |
|null                                         |en                                           |539                                          |
|null                                         |en                                           |542                                          |
|null                                         |en                                           |534                                          |
|null                                         |en                                           |414                                          |
|null                                         |en                                           |9                                            |
|null                                         |en                                           |14                                           |
|null                                         |en                                           |22                                           |
|null                                         |en                                           |15                                           |
|null                                         |en                                           |14                                           |
|null                                         |en                                           |84                                           |
|null                                         |en                                           |591                                          |
|null                                         |en                                           |633                                          |
|null                                         |en                                           |633                                          |
|null                                         |en                                           |612                                          |
|null                                         |en                                           |478                                          |
Query terminated

Tangentially related: #4000

@rmoff rmoff added the bug label Dec 2, 2019
@big-andy-coates
Copy link
Contributor

Likely, this is related to the special handling the UDAFs WindowStart() and WindowEnd() get.

Workaround:
Pull queries expose WINDOWSTART on windowed tables anyway. You just need to issue a SELECT * FROM TWEET_LANG WHERE ROWKEY='en'; and it will return a column called WINDOWSTART, properly populated.

@mikebin
Copy link

mikebin commented Dec 2, 2019

@big-andy-coates - there's no way to format WINDOWSTART returned from a pull query as a readable string or otherwise work with it in a projection at the moment until #3633, is that correct?

@rmoff
Copy link
Contributor Author

rmoff commented Dec 3, 2019

ksql> SELECT * FROM TWEET_LANG WHERE ROWKEY='en';
+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
|ROWKEY                    |WINDOWSTART               |WINDOW_TS                 |LANG                      |TWEET_COUNT               |
+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
|en                        |1575302700000             |null                      |en                        |303                       |
|en                        |1575303000000             |null                      |en                        |507                       |
|en                        |1575303300000             |null                      |en                        |549                       |
|en                        |1575303600000             |null                      |en                        |498                       |
|en                        |1575303900000             |null                      |en                        |555                       |
|en                        |1575304200000             |null                      |en                        |539                       |
|en                        |1575304500000             |null                      |en                        |542                       |
|en                        |1575304800000             |null                      |en                        |534                       |
|en                        |1575305100000             |null                      |en                        |414                       |
|en                        |1575305400000             |null                      |en                        |9                         |
|en                        |1575305700000             |null                      |en                        |14                        |
|en                        |1575306000000             |null                      |en                        |22                        |
|en                        |1575306300000             |null                      |en                        |15                        |
|en                        |1575306600000             |null                      |en                        |14                        |
|en                        |1575306900000             |null                      |en                        |84                        |
|en                        |1575307200000             |null                      |en                        |591                       |
|en                        |1575307500000             |null                      |en                        |633                       |
|en                        |1575307800000             |null                      |en                        |633                       |
|en                        |1575308100000             |null                      |en                        |612                       |
|en                        |1575308400000             |null                      |en                        |587                       |
|en                        |1575308700000             |null                      |en                        |585                       |
|en                        |1575309000000             |null                      |en                        |557                       |
|en                        |1575309300000             |null                      |en                        |574                       |
|en                        |1575309600000             |null                      |en                        |601                       |
|en                        |1575309900000             |null                      |en                        |611                       |
|en                        |1575310200000             |null                      |en                        |658                       |
|en                        |1575310500000             |null                      |en                        |433                       |
Query terminated
ksql>

This workaround kind of works, but as @mikebin says, there's no way to format the field since it can't be referenced (#3633)

@rmoff rmoff changed the title ksqlDB table incorrectly returns null values ksqlDB table incorrectly returns window-based field as null in pull query Dec 3, 2019
@big-andy-coates
Copy link
Contributor

@big-andy-coates - there's no way to format WINDOWSTART returned from a pull query as a readable string or otherwise work with it in a projection at the moment until #3633, is that correct?

Yes, that's right

@apurvam apurvam added this to the 0.7.0 milestone Dec 10, 2019
big-andy-coates added a commit to big-andy-coates/ksql that referenced this issue Jan 29, 2020
fixes: confluentinc#3871

Is needed to fix:
- confluentinc#3633
- confluentinc#4015

Before this change the version of `ROWKEY` copied to the value schema during processing of data in the Streams topology was always of type `STRING` regardless of the actual key type. This is because windowed keys had a `ROWKEY` in the format `<actual key> : Window{start=<windowStart>, end=<windowEnd>}`. While `ROWKEY` in the value schema was a `STRING`, `ROWKEY` in the key schema was the actual type, e.g. `INT`.  This is confusing and will lead to bugs.  Also, the formated string isn't very friendly for users.

This change looks to introduce the `WINDOWSTART` and `WINDOWEND` columns that were reserved in confluentinc#4388. The obvious approach would be to add `WINDOWSTART` and `WINDOWEND` as columns in the key schema. Unfortunately, this would be a much bigger change as many parts of the code currently rely on there being only a single key column. The planned structured key work will resolve this.

For now, we only add the windows bounds columns when we `LogicalSchema.withMetaAndKeyColsInValue(true)`. This is a bit of a temporary hack, but gets us where we need to be. This will be cleaned up as part of the structured key work.

With this change `ROWKEY` for windowed sources no longer has the format `<actual key> : Window{start=<windowStart>, end=<windowEnd>}`: `ROWKEY` is now only the _actual_ key and the window bounds can be accessed by `WINDOWSTART` and `WINDOWEND`. These two window bounds columns are included in a pull `SELECT *` query. Likewise a join will include the window bounds columns from both sides in the join result if the join is `SELECT *`.

## Examples:

### Push queries

* A select * on a windowed source will not include `WINDOWSTART` and `WINDOWEND`. `ROWKEY` will be the actual key, not a formatted string.

```
ksql> SELECT * FROM windowedSource emit changes

-- old output
+---------------+------------------------------------------------------+--------+---------+------+
| ROWTIME       | ROWKEY                                               | USERID | PAGEID  | TOTAL|
+---------------+------------------------------------------------------+--------+---------+------+
| 1557183929488 | User_9|+|Page_39 : Window{start=1557183900000 end=-} | User_9 | Page_39 | 1    |
| 1557183930211 | User_1|+|Page_79 : Window{start=1557183900000 end=-} | User_1 | Page_79 | 1    |

-- new output
+---------------+---------------+---------------+------------------+--------+---------+------+
| ROWTIME       | WINDOWSTART   | WINDOWEND     | ROWKEY           | USERID | PAGEID  | TOTAL|
+---------------+---------------+---------------+------------------+--------+---------+------+
| 1557183919786 | 1557183900000 | 1557183960000 | User_5|+|Page_12 | User_5 | Page_12 | 1    |
| 1557183929488 | 1557183900000 | 1557183960000 | User_9|+|Page_39 | User_9 | Page_39 | 1    |
```

* `WINDOWSTART` and `WINDOWEND` are available in the SELECT, GROUPBY, WHERE, HAVING clauses etc.

For example:

```sql
SELECT TIMESTAMPTOSTRING(WINDOWSTART,'yyyy-MM-dd HH:mm:ss Z') FROM windowedSource emit changes;
```

However, don't get too excited just yet as there is a known limitation that drastically reduces the availability of this syntax:

**KNOWN LIMITATION**
Where a query builds a windowed source from a non-windowed source the window bounds columns are not available.  For example:

```
-- won't yet work:
SELECT WINDOWSTART FROM FROM someSource WINDOW TUMBLING (SIZE 1 SECOND) group by ROWKEY;
```

This issue is tracked by: confluentinc#4397

* Joins of windowed sources include the `WINDOWSTART` and `WINDOWEND` columns from both sides.

### Pull queries

**KNOWN LIMITATION**
Pull queries have not been updated yet. This will be done in a follow up PR confluentinc#3633. This is mainly to keep this PR manageable.

### Persistent queries

Persistent C*AS queries work similar to push queries and have the same known limitation.

BREAKING CHANGE: Any query of a windowed source that uses `ROWKEY` in the SELECT projection will see the contents of `ROWKEY` change from a formatted `STRING` containing the underlying key and the window bounds, to just the underlying key.  Queries can access the window bounds using `WINDOWSTART` and `WINDOWEND`.

BREAKING CHANGE: Joins on windowed sources now include `WINDOWSTART` and `WINDOWEND` columns from both sides on a `SELECT *`.
@big-andy-coates
Copy link
Contributor

FYI, once #4404 is merged the workaround will allow formatting of the window bounds:

ksql> SELECT 
   ROWKEY,  
   TIMESTAMPTOSTRING(WINDOWSTART,'yyyy-MM-dd HH:mm:ss Z') AS WSTART,
   TIMESTAMPTOSTRING(WINDOWEND,'yyyy-MM-dd HH:mm:ss Z') AS WEND,
   LANG,
   TWEET_COUNT
   FROM TWEET_LANG WHERE ROWKEY='en'
   LIMIT 1;

+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
|ROWKEY                    |WINDOWSTART               |WINDOWEND                 |LANG                      |TWEET_COUNT               |
+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
|en                        |2019-12-02 16:05:00 +0000 |2019-12-02 16:06:00 +0000 |en                        |303                       |
Limit Reached
Query terminated
ksql>

big-andy-coates added a commit that referenced this issue Jan 29, 2020
#4401)

* chore: support window bounds columns in persistent and pull queries

fixes: #3871

Is needed to fix:
- #3633
- #4015

Before this change the version of `ROWKEY` copied to the value schema during processing of data in the Streams topology was always of type `STRING` regardless of the actual key type. This is because windowed keys had a `ROWKEY` in the format `<actual key> : Window{start=<windowStart>, end=<windowEnd>}`. While `ROWKEY` in the value schema was a `STRING`, `ROWKEY` in the key schema was the actual type, e.g. `INT`.  This is confusing and will lead to bugs.  Also, the formated string isn't very friendly for users.

This change looks to introduce the `WINDOWSTART` and `WINDOWEND` columns that were reserved in #4388. The obvious approach would be to add `WINDOWSTART` and `WINDOWEND` as columns in the key schema. Unfortunately, this would be a much bigger change as many parts of the code currently rely on there being only a single key column. The planned structured key work will resolve this.

For now, we only add the windows bounds columns when we `LogicalSchema.withMetaAndKeyColsInValue(true)`. This is a bit of a temporary hack, but gets us where we need to be. This will be cleaned up as part of the structured key work.

With this change `ROWKEY` for windowed sources no longer has the format `<actual key> : Window{start=<windowStart>, end=<windowEnd>}`: `ROWKEY` is now only the _actual_ key and the window bounds can be accessed by `WINDOWSTART` and `WINDOWEND`. These two window bounds columns are included in a pull `SELECT *` query. Likewise a join will include the window bounds columns from both sides in the join result if the join is `SELECT *`.

## Examples:

### Push queries

* A select * on a windowed source will not include `WINDOWSTART` and `WINDOWEND`. `ROWKEY` will be the actual key, not a formatted string.

```
ksql> SELECT * FROM windowedSource emit changes

-- old output
+---------------+------------------------------------------------------+--------+---------+------+
| ROWTIME       | ROWKEY                                               | USERID | PAGEID  | TOTAL|
+---------------+------------------------------------------------------+--------+---------+------+
| 1557183929488 | User_9|+|Page_39 : Window{start=1557183900000 end=-} | User_9 | Page_39 | 1    |
| 1557183930211 | User_1|+|Page_79 : Window{start=1557183900000 end=-} | User_1 | Page_79 | 1    |

-- new output
+---------------+---------------+---------------+------------------+--------+---------+------+
| ROWTIME       | WINDOWSTART   | WINDOWEND     | ROWKEY           | USERID | PAGEID  | TOTAL|
+---------------+---------------+---------------+------------------+--------+---------+------+
| 1557183919786 | 1557183900000 | 1557183960000 | User_5|+|Page_12 | User_5 | Page_12 | 1    |
| 1557183929488 | 1557183900000 | 1557183960000 | User_9|+|Page_39 | User_9 | Page_39 | 1    |
```

* `WINDOWSTART` and `WINDOWEND` are available in the SELECT, GROUPBY, WHERE, HAVING clauses etc.

For example:

```sql
SELECT TIMESTAMPTOSTRING(WINDOWSTART,'yyyy-MM-dd HH:mm:ss Z') FROM windowedSource emit changes;
```

However, don't get too excited just yet as there is a known limitation that drastically reduces the availability of this syntax:

**KNOWN LIMITATION**
Where a query builds a windowed source from a non-windowed source the window bounds columns are not available.  For example:

```
-- won't yet work:
SELECT WINDOWSTART FROM FROM someSource WINDOW TUMBLING (SIZE 1 SECOND) group by ROWKEY;
```

This issue is tracked by: #4397

* Joins of windowed sources include the `WINDOWSTART` and `WINDOWEND` columns from both sides.

### Pull queries

**KNOWN LIMITATION**
Pull queries have not been updated yet. This will be done in a follow up PR #3633. This is mainly to keep this PR manageable.

### Persistent queries

Persistent C*AS queries work similar to push queries and have the same known limitation.

BREAKING CHANGE: Any query of a windowed source that uses `ROWKEY` in the SELECT projection will see the contents of `ROWKEY` change from a formatted `STRING` containing the underlying key and the window bounds, to just the underlying key.  Queries can access the window bounds using `WINDOWSTART` and `WINDOWEND`.

BREAKING CHANGE: Joins on windowed sources now include `WINDOWSTART` and `WINDOWEND` columns from both sides on a `SELECT *`.
@big-andy-coates
Copy link
Contributor

big-andy-coates commented Jan 31, 2020

Can be recreated with the following RQTT test:

{
      "name": "windowStart and windowEnd UDAFs",
      "statements": [
        "CREATE STREAM ALL_TWEETS (LANG STRING) WITH (kafka_topic='test_topic', value_format='JSON');",
        "CREATE TABLE TWEET_LANG AS SELECT TIMESTAMPTOSTRING(WINDOWSTART(),'yyyy-MM-dd HH:mm:ss Z') AS WINDOW_TS, LANG, COUNT(*) AS TWEET_COUNT FROM ALL_TWEETS WINDOW TUMBLING (SIZE 5 MINUTES) GROUP BY LANG;",
        "SELECT WINDOW_TS, LANG, TWEET_COUNT FROM TWEET_LANG WHERE ROWKEY='en';"
      ],
      "inputs": [
        {"topic": "test_topic", "timestamp": 1580223282123, "value": {"lang": "en"}},
        {"topic": "test_topic", "timestamp": 1580223282323, "value": {"lang": "en"}},
        {"topic": "test_topic", "timestamp": 1580223283123, "value": {"lang": "en"}}
      ],
      "responses": [
        {"admin": {"@type": "currentStatus"}},
        {"admin": {"@type": "currentStatus"}},
        {"query": [
          {"header":{"schema":"`WINDOW_TS` STRING, `LANG` STRING, `TWEET_COUNT` BIGINT"}},
          {"row":{"columns":["2020-01-28 14:54:42 +0000", "en", 1]}},
          {"row":{"columns":["2020-01-28 14:54:42 +0000", "en", 2]}}
        ]}
      ]
    }

Which fails because row returned is:

"row":{"columns":[null,"en",3]}

big-andy-coates added a commit to big-andy-coates/ksql that referenced this issue Feb 4, 2020
fixes: confluentinc#4015

At present `WindowStart()` and `WindowEnd()` UDAFs are special cased.  This special casing was not being applied to pull queries. This change corrects this.

Consider:

```json
-- setup:
CREATE STREAM ALL_TWEETS (LANG STRING) WITH (kafka_topic='test_topic', value_format='JSON');
CREATE TABLE TWEET_LANG AS SELECT TIMESTAMPTOSTRING(WINDOWSTART(),'yyyy-MM-dd HH:mm:ss Z', 'UTC') AS WSTART, TIMESTAMPTOSTRING(WINDOWEND(),'yyyy-MM-dd HH:mm:ss Z', 'UTC') AS WEND, LANG, COUNT(*) AS TWEET_COUNT FROM ALL_TWEETS WINDOW TUMBLING (SIZE 1 SECOND) GROUP BY LANG;

-- pull query:
SELECT WSTART, WEND, LANG, TWEET_COUNT FROM TWEET_LANG WHERE ROWKEY='en';
```

Before this change the pull query would return `null` values for `WSTART` and `WEND`, even though the data was correctly populated in the `TWEET_LANG` topic. With this change the correct values for `WSTART` and `WEND` are returned.

The main fix is in `StreamAggregateBuilder`, which now applies a suitable `map` call that will apply the special processing to any pull query.
big-andy-coates added a commit that referenced this issue Feb 4, 2020
fixes: #4015

At present `WindowStart()` and `WindowEnd()` UDAFs are special cased.  This special casing was not being applied to pull queries. This change corrects this.

Consider:

```json
-- setup:
CREATE STREAM ALL_TWEETS (LANG STRING) WITH (kafka_topic='test_topic', value_format='JSON');
CREATE TABLE TWEET_LANG AS SELECT TIMESTAMPTOSTRING(WINDOWSTART(),'yyyy-MM-dd HH:mm:ss Z', 'UTC') AS WSTART, TIMESTAMPTOSTRING(WINDOWEND(),'yyyy-MM-dd HH:mm:ss Z', 'UTC') AS WEND, LANG, COUNT(*) AS TWEET_COUNT FROM ALL_TWEETS WINDOW TUMBLING (SIZE 1 SECOND) GROUP BY LANG;

-- pull query:
SELECT WSTART, WEND, LANG, TWEET_COUNT FROM TWEET_LANG WHERE ROWKEY='en';
```

Before this change the pull query would return `null` values for `WSTART` and `WEND`, even though the data was correctly populated in the `TWEET_LANG` topic. With this change the correct values for `WSTART` and `WEND` are returned.

The main fix is in `StreamAggregateBuilder`, which now applies a suitable `map` call that will apply the special processing to any pull query.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants