Skip to content

Generate geo-first tgeo spatial-predicate operators#193

Open
estebanzimanyi wants to merge 5 commits into
MobilityDB:mainfrom
estebanzimanyi:feat/nebula-geo-first-tgeo-predicates
Open

Generate geo-first tgeo spatial-predicate operators#193
estebanzimanyi wants to merge 5 commits into
MobilityDB:mainfrom
estebanzimanyi:feat/nebula-geo-first-tgeo-predicates

Conversation

@estebanzimanyi

Copy link
Copy Markdown
Member

Generates the 9 geometry-first temporal-geo spatial predicates — covers,
disjoint, intersects, touches, and dwithin with a static geometry as the
first argument and a temporal geo as the second (ever and always variants) —
across the logical and physical layers, with matching grammar tokens, parser
dispatch, and CMake entries.

The temporal-point spatial-relation templates build the temporal geometry and
the static geometry identically in either argument order; only the operand order
of the MEOS call differs. A geo_first descriptor flag parameterizes that
operand order, so the shared templates emit both the temporal-first calls
(eintersects_tgeo_geo) and the geo-first calls (eintersects_geo_tgeo) with no
duplication. The geo-first relations classify onto the existing temporal-point
and temporal-point-with-distance builders. These mirror the already-wired
temporal-first predicates with the arguments swapped.

Both physical layouts (temporal-point and temporal-point-with-distance) compile
against an all-families (-DALL) libmeos.

Stacked on #170 (generator infrastructure); the shared generator changes land there first.

…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.
Generate the 9 geometry-first temporal-geo spatial predicates — covers,
disjoint, intersects, touches, and dwithin with a static geometry as the first
argument and a temporal geo as the second (ever and always variants) — across
the logical and physical layers, with matching grammar tokens, parser dispatch,
and CMake entries.

The temporal-point spatial-relation templates build the temporal geometry and
the static geometry the same way in either argument order; only the operand
order of the MEOS call differs. Parameterize that operand order through a
geo_first descriptor flag so the shared templates emit both the temporal-first
calls (eintersects_tgeo_geo) and the geo-first calls (eintersects_geo_tgeo)
without duplication, and classify the geo-first spatial relations onto the
existing temporal-point and temporal-point-with-distance builders.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant