Skip to content

feat(bindings): temporal time-position predicates (before, after, overbefore, overafter)#33

Closed
estebanzimanyi wants to merge 1 commit intofeat/temporal-topopsfrom
feat/temporal-posops
Closed

feat(bindings): temporal time-position predicates (before, after, overbefore, overafter)#33
estebanzimanyi wants to merge 1 commit intofeat/temporal-topopsfrom
feat/temporal-posops

Conversation

@estebanzimanyi
Copy link
Copy Markdown
Member

Summary

Adds 96 ScalarFunction registrations for temporal time-position predicates as named functions. DuckDB's parser does not accept # as an operator-name character, so the upstream MobilityDB operators <<#, #>>, &<#, #&> cannot be reached from SQL — the named forms before / after / overbefore / overafter provide equivalent behaviour.

Surface Count MEOS
temporal × temporal 64 (4 ops × 4×4 type pairs) before/after/overbefore/overafter_temporal_temporal
temporal × tstzspan 16 (4 ops × 4 temporal × 1 span) before/after/overbefore/overafter_temporal_tstzspan
tstzspan × temporal 16 (4 ops × 4 reverse direction) reverse-order via inverse op

Backed by 12 wrapper functions reusing TempTempBoolPred / TempSpanBoolPred / SpanTempBoolPred from PR #32.

For reverse direction, MEOS only exposes the temporal-span variant; the reverse calls swap arg order and use the inverse op (span before temporalafter_temporal_tstzspan(t, s), etc.).

Smoke test

SELECT before(tint '[1@01-01, 2@01-02]', tint '[3@01-05, 4@01-06]');     -- true
SELECT after (tint '[3@01-05, 4@01-06]', tint '[1@01-01, 2@01-02]');     -- true
SELECT overbefore(tint '[1@01-01, 2@01-02]', tint '[2@01-02, 3@01-03]'); -- true
SELECT before(tint '[1@01-01, 5@01-05]', tstzspan '[01-08, 01-10]');     -- true
SELECT after (tstzspan '[01-01, 01-03]', tint '[5@01-05, 6@01-06]');     -- false

Test plan

Dependencies

Stacked on PR #32 (temporal topological predicates). Merge order: #27#29#30#31#32 → this.

…rbefore, overafter)

Adds 96 ScalarFunction registrations for temporal time-position
predicates as named functions (DuckDB's parser does not accept `#`
as an operator-name character, so the upstream MobilityDB operators
`<<#`, `#>>`, `&<#`, `#&>` cannot be reached from SQL — the named
forms `before` / `after` / `overbefore` / `overafter` provide
equivalent behaviour).

Coverage:
- temporal × temporal       (4 ops × 4×4 type pairs = 64)
- temporal × tstzspan       (4 ops × 4 temporal types × 1 span = 16)
- tstzspan × temporal       (4 ops × 4 reverse direction = 16)

Backed by 12 wrapper functions reusing the TempTempBoolPred /
TempSpanBoolPred / SpanTempBoolPred templated helpers from the
topological-predicates PR.

Reverse-direction (`tstzspan op temporal`): MEOS only exposes the
temporal-span direction, so the reverse calls swap arg order and
use the inverse op:
  span before temporal  -> after_temporal_tstzspan(t, s)
  span after  temporal  -> before_temporal_tstzspan(t, s)
  span overbefore temp  -> overafter_temporal_tstzspan(t, s)
  span overafter  temp  -> overbefore_temporal_tstzspan(t, s)

Smoke test:
  SELECT before(tint '[1@01-01, 2@01-02]', tint '[3@01-05, 4@01-06]'); -- true
  SELECT after (tint '[3@01-05, 4@01-06]', tint '[1@01-01, 2@01-02]'); -- true
  SELECT overbefore(tint '[1@01-01, 2@01-02]', tint '[2@01-02, 3@01-03]'); -- true
  SELECT before(tint '[1@01-01, 5@01-05]', tstzspan '[01-08, 01-10]');     -- true
  SELECT after (tstzspan '[01-01, 01-03]', tint '[5@01-05, 6@01-06]');     -- false

Stacked on PR #32 (temporal topops).

Full suite passes (747 assertions, 13 test cases).
@estebanzimanyi
Copy link
Copy Markdown
Member Author

Consolidated into #42 (temporal time-domain predicates — topo + position combined).

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