Generate trgeometry spatial-predicate operators - #192
Conversation
…aho-mqtt-cpp The Nix environment provides paho-mqtt-cpp as a shared-only library and does not include libmeos. Four changes make the build pass: - flake.nix: add stock paho-mqtt-c + paho-mqtt-cpp to baseThirdPartyDeps; pass -DNES_ENABLE_MEOS=OFF in both defaultPackage and devShell cmakeFlags. - nes-plugins/CMakeLists.txt: introduce NES_ENABLE_MQTT and NES_ENABLE_MEOS options that gate the respective plugin subdirectories via activate_optional_plugin(). - nes-plugins/Sources/MQTTSource, nes-plugins/Sinks/MQTTSink: select PahoMqttCpp::paho-mqttpp3-static when available, fall back to the shared PahoMqttCpp::paho-mqttpp3 target (Nix only ships the shared variant). - nes-physical-operators: gate all MEOS-specific add_plugin calls and the nes-meos link behind if(NES_ENABLE_MEOS) in three CMakeLists files (top-level, Functions/Meos, Aggregation/Function/Meos). - CMakeLists.txt (root): declare option(NES_ENABLE_MEOS) and add_compile_definitions(NES_ENABLE_MEOS) before the nes-* subdirectory loop so the preprocessor symbol is visible to all sibling components. - nes-query-optimizer/LowerToPhysicalWindowedAggregation.cpp: guard the TemporalSequenceAggregationPhysicalFunction include and instantiation with #ifdef NES_ENABLE_MEOS so the translation unit compiles and links when MEOS is disabled.
… build/grammar/QPC glue tools/codegen/ contains codegen_nebula.py, which reads a JSON operator descriptor and emits the four-layer NebulaStream pipeline tuple (logical .hpp/.cpp + physical .hpp/.cpp) per MEOS scalar function, then idempotently injects add_plugin entries into the Meos CMakeLists files, lexer tokens and functionName alternations into AntlrSQL.g4, and dispatch cases into AntlrSQLQueryPlanCreator.cpp — each injection gated by a per-op marker so repeated runs are safe. build_descriptor.py classifies MEOS gap functions by signature into named SHAPEs that select the corresponding physical C++ template; trgeo-descriptor.json is the ready-to-use descriptor for the 34-operator trgeometry family (W148–W149). codegen_aggregations.py handles the separate aggregation four-layer shape. codegen_input.example.json documents the descriptor format. build_local.sh drives the NebulaStream dev-image cmake build without a host C++23 toolchain. The generator reproduces the committed W148–W149 trgeometry surface byte-for-byte from the descriptor. The generated IDL (meos-idl.json) is excluded from the repository and regenerated via MEOS-API run.py against the pinned MEOS headers.
…LIZED*
MEOS-API run.py correctly resolves GSERIALIZED in the IDL; parse_sigs
normalizes `const GSERIALIZED *` to GSERIALIZED* (strip-const + first-token
+ "*"). The four trgeometry shape classifiers that match geometry arguments
use GSERIALIZED* throughout:
- trgeometry_geo_predicate: (Temporal*, int*) → (Temporal*, GSERIALIZED*)
- geo_trgeometry_predicate: (int*, Temporal*) → (GSERIALIZED*, Temporal*)
- trgeometry_geo_dwithin: (Temporal*, int*, double) → (Temporal*, GSERIALIZED*, double)
- trgeometry_nad geo-branch: (Temporal*, int*) → (Temporal*, GSERIALIZED*)
The trgeometry_nad two-temporal branch adds fn.endswith("_trgeometry") so
nad_trgeometry_tpoint (Temporal*, Temporal*) is excluded, matching the
committed descriptor's scope.
Equivalence probe: build_descriptor.py against the master IDL (4492 fns)
reproduces the committed trgeo-descriptor.json 34-operator set byte-for-byte.
Genuine int* out-params (trgeometry_instants/segments/sequences/stboxes, all
with non-int return types) are unaffected. nad_trgeometry_tpoint is correctly
excluded.
…lways verbs
cmp_scalar_tempfirst and cmp_scalar_scalarfirst matched on signature alone, so a nearest-approach
function like nad_tint_int (int(Temporal*, int)) was misclassified as a comparison operator. Require
the ever/always + {eq,ne,lt,le,gt,ge} naming so only comparison functions match.
Repair the trgeometry predicate operator templates for the current Nautilus value API and regenerate the 20 trgeometry spatial predicates: contains, covers, disjoint, intersects, touches, and dwithin for the trgeometry/geo, geo/trgeometry, and trgeometry/trgeometry argument shapes (ever and always variants), across the logical and physical layers, with matching grammar tokens, parser dispatch, and CMake entries. The predicate builders reconstruct a trgeometry instant from a geometry WKT plus pose components and pass it to the MEOS spatial-relation call. Two template corrections make them compile against the current engine: VariableSizedData inputs are expanded into an explicit (pointer, size) pair at the nautilus::invoke call site, matching how the invoke argument pack is bound; and scalar record values are cast through nautilus::val<T> rather than the bare C type, which is the value form the VarVal variant holds. These builders were previously exercised only by the eq/ne and nad layouts, so the predicate paths carried the stale forms.
|
The emitted operators are a build product and the generator is the asset. The generator names every operator from the catalog's |
Generates the 20 trgeometry spatial-predicate operators —
contains,covers,disjoint,intersects,touches, anddwithinfor the trgeometry/geo,geo/trgeometry, and trgeometry/trgeometry argument shapes (
everandalwaysvariants) — across the logical and physical layers, with matching grammar
tokens, parser dispatch, and CMake entries.
Repairs the predicate builder templates so they compile against the current
Nautilus value API:
VariableSizedDatainputs expand into an explicit(pointer, size)pair at thenautilus::invokecall site (matching how theinvoke argument pack binds), and scalar record values cast through
nautilus::val<T>rather than the bare C type (the value form theVarValvariant holds). These corrections bring the spatial-predicate paths in line with
the eq/ne and nad layouts.
All three physical layouts (trgeometry/geo, geo/trgeometry, trgeometry/trgeometry,
plus the two dwithin variants) compile against an all-families (
-DALL) libmeos.Stacked on #170 (generator infrastructure); the shared generator changes land there first.