nielspardon opened a new issue, #12842:
URL: https://github.com/apache/gluten/issues/12842

   ### Background
   
   Gluten's ClickHouse backend has three `ReadRel.ExtensionTable`-based reads: 
MergeTree, Range, and (as of #12841) Kafka. Kafka now discriminates its read 
the idiomatic way — by the `Any` type_url of `ExtensionTable.detail`, via 
`detail().Is<gluten::StreamKafka>()`, using a typed Gluten-owned payload 
message (`gluten.StreamKafka` in `kafka.proto`). This mirrors the 
already-merged Velox Iceberg idiom 
`enhancement().Is<::gluten::IcebergReadExtension>()`. MergeTree and Range still 
use a legacy workaround instead: a hand-rolled text marker string.
   
   ### Current state (the anti-pattern)
   
   **Discriminator** — the producer stamps a text marker into 
`advanced_extension.optimization` as a `google.protobuf.StringValue`, and the 
native consumer discriminates by parsing its prefix:
   
   - `isMergeTree=1\n` — produced at `CHMergeTreeWriterInjects.scala:195`; a 
per-scan `isMergeTree=$flag\n` (0 or 1) is also stamped onto **every** CH scan 
at `BasicScanExecTransformer.scala:187-190`.
   - `isRange=1\n` — produced at `CHRangeExecTransformer.scala:92`.
   - Consumer: `ReadRelParser::isReadRelFromMergeTree` / `isReadRelFromRange` 
at `ReadRelParser.cpp:130-162` (`checkString("isMergeTree=", ...)` / 
`checkString("isRange=", ...)`).
   
   **Payload** — the actual table info rides in `ExtensionTable.detail`, also 
as a `StringValue` text blob: the MergeTree table string is hand-parsed by 
`doParseMergeTreeTableString` (`SparkMergeTreeMeta.cpp:130`); the Range payload 
is JSON, parsed at `ReadRelParser.cpp:234-250`.
   
   Because both payloads are a generic `google.protobuf.StringValue` (type_url 
`type.googleapis.com/google.protobuf.StringValue` for both), the `detail` 
type_url can't tell them apart — which is precisely why the 
`isMergeTree=`/`isRange=` markers were bolted on.
   
   ### Proposal
   
   Give MergeTree and Range typed, Gluten-owned payload messages — the same 
convention as `gluten.StreamKafka` (`package gluten`, 
`org.apache.gluten.proto`), e.g. `gluten.MergeTreeTable` and 
`gluten.RangeTable` — pack them into `ExtensionTable.detail`, and discriminate 
by type_url:
   
   ```cpp
   rel.extension_table().detail().Is<gluten::MergeTreeTable>()
   rel.extension_table().detail().Is<gluten::RangeTable>()
   ```
   
   This drops the `isMergeTree=`/`isRange=` marker strings (including the 
per-scan `isMergeTree=0\n` stamp on non-MergeTree scans) and the hand-rolled 
text/JSON parsing, converging all three CH `ExtensionTable` readers on one 
discrimination model.
   
   ### Scope / why this is a follow-up, not part of #12597
   
   This is a behavioral rewrite of the core CH read path — new proto messages 
plus rewriting both producers and both native parsers — and it is orthogonal to 
the Substrait-0.98 proto rebase (#12597): these blobs are Gluten-internal 
payloads, not Substrait messages, so no rebase increment forces the change. 
#12841 (Kafka) establishes the target model this converges MergeTree/Range onto.
   
   ### Affected code
   
   - Producers: `CHMergeTreeWriterInjects.scala:195`, 
`BasicScanExecTransformer.scala:187-190` (per-scan MergeTree flag), 
`CHRangeExecTransformer.scala:92`.
   - Consumer: `ReadRelParser.cpp` 
(`isReadRelFromMergeTree`/`isReadRelFromRange` at `:130-162`, dispatch at 
`:64-89`, `parseReadRelWithRange` at `:222-250`), `SparkMergeTreeMeta.cpp` 
(`doParseMergeTreeTableString` at `:130`, plus the matching text serializer), 
and the Range JSON payload builder.
   
   Part of the Substrait-0.98 consolidation follow-ups (#12597).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to