Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
6ee075e
docs+scripts: PR coordination policy + audit/lint tooling refresh (co…
estebanzimanyi May 10, 2026
0ae9c41
feat(parity): batch additions toward 100% addressable coverage
estebanzimanyi May 12, 2026
be8eb8d
feat(parity): close final 14-name gap to reach 100% addressable coverage
estebanzimanyi May 12, 2026
1e4d3e4
Bump pinned MEOS to dd4ccd3c2 (post-rename + post-spatial-rels-orthog…
estebanzimanyi May 14, 2026
99d6711
Drop restr/at_value from spatiotemporal relationship surfaces
estebanzimanyi May 14, 2026
2473d38
Rename temptype_continuous to temptype_supports_linear
estebanzimanyi May 14, 2026
4d125ff
Update spatial-rel template signatures to MEOS 2-arg API
estebanzimanyi May 14, 2026
18ee9d1
Update rtree_module to MEOS new bbox_type/MeosArray API
estebanzimanyi May 14, 2026
d4a6ff5
Rename rtree class member to avoid MEOS bbox_type collision
estebanzimanyi May 14, 2026
05602e0
Use MeosType directly in headers (forward-compat alias not always vis…
estebanzimanyi May 14, 2026
9e1d7a6
Pre-stage icu extension for amd64 docker tests
estebanzimanyi May 15, 2026
f896b95
Initialize MEOS per worker thread
estebanzimanyi May 16, 2026
c3dfb70
Refresh tnumber ln/exp/log expected output for MEOS turning points
estebanzimanyi May 16, 2026
a8b1755
Wrap bigint_to_set in an int64_t forwarder for SetUnionAgg
estebanzimanyi May 16, 2026
93acfbb
Fix TRTREE index crash on temporal and span columns
estebanzimanyi May 16, 2026
1313579
Use MEST multi-entry indexing in the TRTREE index
estebanzimanyi May 16, 2026
49b2883
Fix SRID-unknown error building the MEST index on spatial temporals
estebanzimanyi May 16, 2026
d8727cc
Make TRTREE index SRID-agnostic and fix multi-column projection
estebanzimanyi May 16, 2026
1b0b26a
Route constant-geometry spatial-relationship predicates to the TRTREE…
estebanzimanyi May 16, 2026
2e7f101
feat: edge-to-cloud quickstart, temporalFooter, SRID/geodetic fix, tg…
estebanzimanyi May 10, 2026
b5ee4ed
doc: PR Reviewer Guide + visibility wiring + ecosystem consolidation …
estebanzimanyi May 10, 2026
cf36886
fix: drop premature `using meosType = MeosType;` alias in tydef.hpp
estebanzimanyi May 20, 2026
11b180b
diag: surface odd-length hex output from MEOS *_as_hexwkb on macOS arm64
estebanzimanyi May 20, 2026
391264f
Merge remote-tracking branch 'fork/fix/tydef-meostype-alias' into pre…
estebanzimanyi May 20, 2026
0a4479b
Merge remote-tracking branch 'fork/feat/edge-to-cloud-quickstart-reba…
estebanzimanyi May 20, 2026
b98629d
Merge remote-tracking branch 'fork/doc/reviewer-guide-rebased' into p…
estebanzimanyi May 20, 2026
e8accc4
Merge remote-tracking branch 'fork/consolidate/pr-coordination-and-tz…
estebanzimanyi May 20, 2026
57c9735
Merge branch 'draft/hex-wkb-instrumentation' into preview/100-percent
estebanzimanyi May 20, 2026
08de754
docs: remove stale RANGE-support TODOs (RANGE is PG-only by design)
estebanzimanyi May 20, 2026
b8a5cac
Merge remote-tracking branch 'fork/fix/drop-range-todos' into preview…
estebanzimanyi May 20, 2026
094563d
Merge remote-tracking branch 'fork/fix/tydef-meostype-alias' into loc…
estebanzimanyi May 20, 2026
b062338
polyfill(ci): stage icu extension for amd64 docker tests (from open P…
estebanzimanyi May 15, 2026
d01e1be
polyfill(macos/wasm): bigint_to_set_duckdb int64_t forwarder (from op…
estebanzimanyi May 20, 2026
cf15138
doc(geography): document the DuckDB GEOGRAPHY boundary design
estebanzimanyi May 20, 2026
196744e
feat(geography): register GEOGRAPHY LogicalType (skeleton; PR #168 de…
estebanzimanyi May 20, 2026
b389e9a
polyfill: drop premature 'using meosType = MeosType' alias (from open…
estebanzimanyi May 20, 2026
e63811a
polyfill(ci): stage icu extension for amd64 docker tests (from open P…
estebanzimanyi May 20, 2026
64af27d
polyfill(macos/wasm): bigint_to_set_duckdb int64_t forwarder (from op…
estebanzimanyi May 20, 2026
7335e96
fix(geography): include order — mirror stbox.cpp pattern
estebanzimanyi May 20, 2026
35ace49
fix(span_table_functions): explicit unique_ptr<BinsBindData> -> uniqu…
estebanzimanyi May 20, 2026
b703b27
feat(geography): ST_GeogFromText / ST_AsText / ST_AsBinary / ST_GeogF…
estebanzimanyi May 20, 2026
2e6b794
feat(geography): explicit GEOMETRY <-> GEOGRAPHY casts
estebanzimanyi May 20, 2026
be44ff2
feat(geography): ST_Length / ST_Area / eIntersects / nearestApproachD…
estebanzimanyi May 20, 2026
b5d38c3
test(geography): full numeric + NULL + tabular round-trip matrix
estebanzimanyi May 20, 2026
6291190
feat(parity): th3index — full H3 cell index API (66 MEOS exports)
estebanzimanyi May 12, 2026
e47bcea
polyfill(span_table_functions): apply PR #173 unique_ptr fix
estebanzimanyi May 21, 2026
46d21e1
test(tgeogpoint): pin TZ display fixtures to Brussels (matches extens…
estebanzimanyi May 21, 2026
0931b9f
polyfill: drop premature 'using meosType = MeosType' alias (from open…
estebanzimanyi May 20, 2026
22dbf62
polyfill(ci): stage icu extension for amd64 docker tests (from open P…
estebanzimanyi May 20, 2026
4949535
polyfill(macos/wasm): bigint_to_set_duckdb int64_t forwarder (from op…
estebanzimanyi May 20, 2026
e151160
fix(span_table_functions): explicit unique_ptr<BinsBindData> -> uniqu…
estebanzimanyi May 20, 2026
a23a5b2
fix(extension): skip MEOS timezone init when no zoneinfo on system
estebanzimanyi May 21, 2026
7d3856e
fix(eIntersects): defensive arg-order swap for DuckDB alias-erased di…
estebanzimanyi May 21, 2026
54b90a1
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
4ce3492
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
3017f67
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
2ff6042
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
f44b02c
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
69b4386
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
1e4c221
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
3c01791
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
5d480de
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
5f716fe
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
0c9287c
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
dd71087
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
6737d69
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
971c968
Stage icu for the macOS osx_arm64 test path too
estebanzimanyi May 16, 2026
1c1fc46
Merge remote-tracking branch 'fork/feat/trtree-mest-multientry' into …
estebanzimanyi May 21, 2026
d08529b
Merge remote-tracking branch 'fork/feat/trtree-spatialrel-pushdown' i…
estebanzimanyi May 21, 2026
c32de9c
Merge remote-tracking branch 'fork/feat/parity-th3index' into integra…
estebanzimanyi May 21, 2026
0a17973
Merge remote-tracking branch 'fork/fix/tgeogpoint-test-tz-pinned' int…
estebanzimanyi May 21, 2026
24e2871
Merge remote-tracking branch 'fork/fix/meos-tz-init-resilient' into i…
estebanzimanyi May 21, 2026
9012fdb
Merge remote-tracking branch 'fork/feat/register-geography-logicaltyp…
estebanzimanyi May 21, 2026
6cfcfb6
Merge remote-tracking branch 'fork/feat/geography-io-udfs' into integ…
estebanzimanyi May 21, 2026
b400ee9
Merge remote-tracking branch 'fork/feat/geography-casts' into integra…
estebanzimanyi May 21, 2026
75de257
Merge remote-tracking branch 'fork/feat/geography-operations' into in…
estebanzimanyi May 21, 2026
e5e3cc1
Merge remote-tracking branch 'fork/feat/geography-test-matrix' into i…
estebanzimanyi May 21, 2026
d449a29
chore(meos): pin to estebanzimanyi/MobilityDB:fix/meos-pg-symbol-coll…
estebanzimanyi May 21, 2026
7b1bf0a
fix(integration): bridge alias for meosType + unique_ptr Copy() return
estebanzimanyi May 21, 2026
02dc814
chore(meos): pin to combined branch (integration + th3index + symbol-…
estebanzimanyi May 21, 2026
b18d8fd
Rename temptype_continuous to temptype_supports_linear
estebanzimanyi May 14, 2026
1bd3f41
Drop restr/at_value from spatiotemporal relationship surfaces
estebanzimanyi May 14, 2026
7bf00b2
Update rtree_module to MEOS new bbox_type/MeosArray API
estebanzimanyi May 14, 2026
c54de87
Rename rtree class member to avoid MEOS bbox_type collision
estebanzimanyi May 14, 2026
a07f438
Use MeosType directly in headers (forward-compat alias not always vis…
estebanzimanyi May 14, 2026
18590b7
fix(integration): use MeosType (not meosType) in geo_util.hpp BlobLoo…
estebanzimanyi May 21, 2026
84b1817
fix(integration): restore complete temporal_functions.cpp + tgeompoin…
estebanzimanyi May 21, 2026
038bf91
fix(integration): local DatumGetBool shim in tgeompoint_functions.cpp
estebanzimanyi May 21, 2026
e4b6317
Revert "fix(integration): local DatumGetBool shim in tgeompoint_funct…
estebanzimanyi May 21, 2026
c12fd54
fix(integration): add DatumGetBool to tydef.hpp Datum-macro family
estebanzimanyi May 21, 2026
9de3fbe
chore(deps): bump duckdb to v1.4.4 + extension-ci-tools to v1.4.4
estebanzimanyi May 22, 2026
068362e
Merge remote-tracking branch 'fork/feat/parity-final-batch' into inte…
estebanzimanyi May 22, 2026
1558c8f
Merge remote-tracking branch 'fork/fix/tnumber-math-turnpt-expected' …
estebanzimanyi May 22, 2026
7a578ca
Merge remote-tracking branch 'fork/fix/trtree-index-assertion' into i…
estebanzimanyi May 22, 2026
c89eac8
Merge remote-tracking branch 'fork/fix/macos-int64-bigint-to-set-forw…
estebanzimanyi May 22, 2026
2dd9a87
Restore parity surface dropped during the symbol-fix refactor
estebanzimanyi May 22, 2026
97cc362
Align test fixtures to the Europe/Brussels single-timezone model
estebanzimanyi May 22, 2026
1d06e0c
Fix continuous-type span adjacency: re-pin MEOS + correct -|- fixtures
estebanzimanyi May 22, 2026
99f4fe0
Add timeTiles(tgeompoint/tgeogpoint) temporal-input overloads
estebanzimanyi May 24, 2026
da2d1e3
Make ICU timezone setup resilient and version-agnostic
estebanzimanyi May 25, 2026
ff4ecbb
Build the pinned MEOS with the CBUFFER, NPOINT, POSE and RGEO modules
estebanzimanyi May 25, 2026
59c07c5
Register the th3index H3IndexTypes surface in LoadInternal
estebanzimanyi May 25, 2026
9c0d677
Bump pinned MEOS to the accumulate/parity-1.4 tip + adapt to its API
estebanzimanyi May 25, 2026
a9c0c36
Fold the h3indexset static-geometry prefilter UDFs (#131)
estebanzimanyi May 25, 2026
baa3d09
Make the pinned MEOS build under newer C compilers (GCC 14 / AppleCla…
estebanzimanyi May 26, 2026
3323d89
Exclude osx_arm64 from CI pending the macOS arm64 hex-WKB fix (cf. #170)
estebanzimanyi May 27, 2026
df3adbf
Fold the core tcbuffer type port (#148)
estebanzimanyi May 25, 2026
94e01ad
Fold the core tnpoint type port (#150)
estebanzimanyi May 25, 2026
ec74d58
Fold the core tpose type port (#151)
estebanzimanyi May 25, 2026
9fa940d
Complete the output-serialization surface for tcbuffer and tnpoint
estebanzimanyi May 26, 2026
8db3629
Fold the core trgeometry type port (#153)
estebanzimanyi May 26, 2026
c5d4a61
Build pgPointCloud libpc.a without autotools to enable POINTCLOUD (#154)
estebanzimanyi May 26, 2026
2491dde
Fold the core tpcpoint type port (#155)
estebanzimanyi May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!--
👀 Reviewers: this project's tier ranking, dependency chains and the
standards checklist live in:
doc/contributing/reviewer-guide.md
PR authors: update that file in the same commit as any PR queue change.
-->

## Summary

<!-- What this PR does, in 1–3 bullets. Focus on the "why". -->

## Test plan

<!-- - [ ] Bullet checklist of TODOs for verifying this PR -->
28 changes: 16 additions & 12 deletions .github/workflows/MainDistributionPipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ jobs:
extension_name: mobilityduck
ci_tools_version: v1.4.4
vcpkg_commit: c27eeddba73f608f10605d80bc0144c1166f8fb7
# Windows is excluded because the MEOS vcpkg port does not currently
# build under MSVC or MinGW: it pulls in PostgreSQL-derived sources
# that depend on POSIX-only headers (e.g. <dirent.h>) and GCC-only
# attribute syntax (`__attribute__((unused))`). Re-enable once the
# MEOS port grows Windows support.
exclude_archs: windows_amd64;windows_amd64_mingw;linux_amd64_musl
# Windows / linux_amd64_musl / wasm_* are excluded because the
# MEOS vcpkg port does not currently build there: Windows pulls in
# POSIX-only headers (e.g. <dirent.h>) and GCC-only attribute syntax,
# and the Wasm/emscripten targets fail to compile PostgreSQL's port
# code (`pg_bitutils.h` cannot pick an integer type matching
# `uint64_t` under the emscripten ABI). Re-enable once the MEOS
# port grows targets for those toolchains.
exclude_archs: windows_amd64;windows_amd64_mingw;linux_amd64_musl;osx_arm64;wasm_mvp;wasm_eh;wasm_threads

duckdb-latest-deploy:
needs: duckdb-latest-build
Expand All @@ -52,9 +54,11 @@ jobs:
ci_tools_version: v1.4.4
extension_name: mobilityduck
deploy_latest: ${{ startsWith(github.ref, 'refs/heads/v') || github.ref == 'refs/heads/main' }}
# Windows is excluded because the MEOS vcpkg port does not currently
# build under MSVC or MinGW: it pulls in PostgreSQL-derived sources
# that depend on POSIX-only headers (e.g. <dirent.h>) and GCC-only
# attribute syntax (`__attribute__((unused))`). Re-enable once the
# MEOS port grows Windows support.
exclude_archs: windows_amd64;windows_amd64_mingw;linux_amd64_musl
# Windows / linux_amd64_musl / wasm_* are excluded because the
# MEOS vcpkg port does not currently build there: Windows pulls in
# POSIX-only headers (e.g. <dirent.h>) and GCC-only attribute syntax,
# and the Wasm/emscripten targets fail to compile PostgreSQL's port
# code (`pg_bitutils.h` cannot pick an integer type matching
# `uint64_t` under the emscripten ABI). Re-enable once the MEOS
# port grows targets for those toolchains.
exclude_archs: windows_amd64;windows_amd64_mingw;linux_amd64_musl;osx_arm64;wasm_mvp;wasm_eh;wasm_threads
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ testext
test/python/__pycache__/
.Rhistory
vcpkg/
*.log
*.log
examples/quickstart/*.parquet
39 changes: 39 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,25 @@ endif()
# MEOS from overlay port
find_package(MEOS CONFIG REQUIRED)

# h3 — transitively needed because `meos_h3.h` includes `<h3api.h>`.
# vcpkg's h3 port installs the header at `include/h3/h3api.h` (under
# a subdirectory). `find_package(h3 CONFIG)` finds the import target
# but its `INTERFACE_INCLUDE_DIRECTORIES` only contains `include/`,
# not `include/h3/`. Probe the header directly with `find_path` and
# add the resolved directory to the global include path so the
# `#include <h3api.h>` in `meos_h3.h` resolves.
find_package(h3 CONFIG)
if(h3_FOUND)
message(STATUS "Found h3 (CONFIG): version ${h3_VERSION}")
endif()
find_path(H3_INCLUDE_DIR NAMES h3api.h PATH_SUFFIXES h3)
if(H3_INCLUDE_DIR)
include_directories(${H3_INCLUDE_DIR})
message(STATUS "Found h3 include dir: ${H3_INCLUDE_DIR}")
else()
message(WARNING "h3api.h not found; the th3index extension surface will fail to compile")
endif()

if(TARGET GEOS::geos_c)
set(GEOS_TGT GEOS::geos_c)
elseif(TARGET GEOS::geos)
Expand All @@ -63,12 +82,22 @@ set(EXTENSION_SOURCES
src/temporal/temporal_aggregates.cpp
src/temporal/tbox.cpp
src/temporal/tbox_functions.cpp
src/geo/geography.cpp
src/geo/geography_functions.cpp
src/geo/stbox.cpp
src/geo/stbox_functions.cpp
src/geo/tgeompoint.cpp
src/geo/tgeompoint_functions.cpp
src/geo/tgeogpoint.cpp
src/geo/tgeogpoint_functions.cpp
src/geo/tcbuffer.cpp
src/geo/tcbuffer_in_out.cpp
src/geo/tnpoint.cpp
src/geo/tnpoint_in_out.cpp
src/geo/tpose.cpp
src/geo/tpose_in_out.cpp
src/rgeo/trgeometry.cpp
src/rgeo/trgeometry_in_out.cpp
src/temporal/set.cpp
src/temporal/set_functions.cpp
src/temporal/span.cpp
Expand All @@ -86,14 +115,18 @@ set(EXTENSION_SOURCES
src/geo/tgeography.cpp
src/geo/tgeography_in_out.cpp
src/geo/tgeography_ops.cpp
src/pointcloud/tpcpoint.cpp
src/pointcloud/tpcpoint_in_out.cpp
src/geo/tgeogpoint.cpp
src/geo/tgeogpoint_in_out.cpp
src/geo/tgeogpoint_ops.cpp
src/h3/th3index.cpp
src/index/rtree_module.cpp
src/single_tile_getters.cpp
src/index/rtree_index_create_physical.cpp
src/index/rtree_index_scan.cpp
src/index/rtree_optimize_scan.cpp
src/temporal/temporal_parquet.cpp
)

build_static_extension(${TARGET_NAME} ${EXTENSION_SOURCES})
Expand All @@ -113,13 +146,18 @@ endif()
# -----------------------------
# Link libraries
# -----------------------------
if(TARGET h3::h3)
set(H3_TGT h3::h3)
endif()

target_link_libraries(${EXTENSION_NAME}
MEOS::meos
${GEOS_TGT}
PROJ::proj
GSL::gsl
GSL::gslcblas
${JSONC_TGT}
${H3_TGT}
OpenSSL::SSL
OpenSSL::Crypto
)
Expand All @@ -131,6 +169,7 @@ target_link_libraries(${LOADABLE_EXTENSION_NAME}
GSL::gsl
GSL::gslcblas
${JSONC_TGT}
${H3_TGT}
OpenSSL::SSL
OpenSSL::Crypto
)
Expand Down
45 changes: 44 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,52 @@ include extension-ci-tools/makefiles/duckdb_extension.Makefile
# both MEOS (meos_initialize_timezone) and DuckDB (DBConfig::SetOptionByName
# "TimeZone") to Europe/Brussels. Tests pass on any OS timezone — the
# extension is the single source of truth, no TZ env var needed.
#
# LoadInternal also calls ExtensionHelper::AutoLoadExtension(db, "icu") so
# the timezone option is honoured. Autoload looks for the extension on disk
# at $HOME/.duckdb/extensions/<duckdb_version>/<platform>/icu.duckdb_extension
# and falls back to a hub download. That fails both inside the linux_amd64
# test docker container (empty path, no network egress) and on the macOS
# osx_arm64 test runner (hub icu not reliably resolvable). We copy the
# icu.duckdb_extension that was built locally as part of this extension's
# build (declared in extension_config.cmake) into the expected path.
#
# Target DuckDB is the v1.4.x LTS line, with later versions (v1.5.x) supported
# in a multi-version matrix (PRs #166/#167) the same way MobilityDB supports
# PostgreSQL 13-18 — so the staging path must NOT hardcode the version or the
# platform. We derive both from the freshly-built duckdb binary (authoritative
# for whatever version/platform is actually being tested); DUCKDB_VERSION_TAG
# and the uname map below are kept only as fallbacks if that query is
# unavailable.
DUCKDB_VERSION_TAG := v1.4.4

define stage_icu
@if [ -f ./build/$(1)/extension/icu/icu.duckdb_extension ]; then \
duckdb_bin=./build/$(1)/duckdb; \
version_tag=$$( [ -x "$$duckdb_bin" ] && "$$duckdb_bin" --version 2>/dev/null | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1 ); \
platform=$$( [ -x "$$duckdb_bin" ] && echo 'PRAGMA platform;' | "$$duckdb_bin" -noheader -list 2>/dev/null | tr -d '[:space:]' ); \
[ -n "$$version_tag" ] || version_tag=$(DUCKDB_VERSION_TAG); \
if [ -z "$$platform" ]; then \
case "$$(uname -s)-$$(uname -m)" in \
Linux-x86_64) platform=linux_amd64 ;; \
Linux-aarch64) platform=linux_arm64 ;; \
Darwin-arm64) platform=osx_arm64 ;; \
Darwin-x86_64) platform=osx_amd64 ;; \
*) platform=$$(uname -m) ;; \
esac; \
fi; \
target=$$HOME/.duckdb/extensions/$$version_tag/$$platform; \
mkdir -p "$$target" && cp -f ./build/$(1)/extension/icu/icu.duckdb_extension "$$target/" && \
echo "Staged icu.duckdb_extension at $$target/ (duckdb $$version_tag / $$platform)"; \
fi
endef

test_release_internal:
$(call stage_icu,release)
./build/release/$(TEST_PATH) "$(PROJ_DIR)test/*"
test_debug_internal:
$(call stage_icu,debug)
./build/debug/$(TEST_PATH) "$(PROJ_DIR)test/*"
test_reldebug_internal:
./build/reldebug/$(TEST_PATH) "$(PROJ_DIR)test/*"
$(call stage_icu,reldebug)
./build/reldebug/$(TEST_PATH) "$(PROJ_DIR)test/*"
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ MobilityDuck because of properties of DuckDB's parser, type system, or
extension model. These cases — and the named-function workarounds where one
exists — are documented in [`docs/DuckDB-Parity-Gaps.md`](docs/DuckDB-Parity-Gaps.md).

Geodetic geography values cross the DuckDB columnar boundary via a dedicated
`GEOGRAPHY` LogicalType that MobilityDuck registers in addition to the bundled
DuckDB Spatial `GEOMETRY`. The design — closed-algebra inside MEOS, thin
boundary layer in the binding, and TemporalParquet round-trip preservation of
the geodetic flag — is documented in [`doc/geography-boundary.md`](doc/geography-boundary.md).

---
## 1. Requirements
MobilityDuck needs some dependencies(including MEOS) which can be installed through VCPKG. Run the following to enable it:
Expand Down
119 changes: 119 additions & 0 deletions doc/contributing/reviewer-guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
<!--
Copyright(c) MobilityDB Contributors

This documentation is licensed under a
Creative Commons Attribution-Share Alike 3.0 License
https://creativecommons.org/licenses/by-sa/3.0/
-->

# MobilityDuck PR Reviewer Guide

Quick reference for anyone reviewing open pull requests.
Updated in the same commit as any PR that changes PR state or adds new branches.
**Last updated: 2026-05-10 — 22 open PRs (net consolidation today): folds #115+#119 → #120, #116+#118 → #121, #122+#123+#124+#125 → #126. Squashed in place: #117, #111. PR #112 TZ-neutral test fix landed (1 commit).**

---

## How to find this guide

- **In the repo:** `doc/contributing/reviewer-guide.md`
- **Rule:** every commit that opens, closes, or restructures a PR must update this file in the same commit. A one-liner status change is enough; a fuller rewrite is needed when the dependency graph changes.

---

## CI legend

| Symbol | Meaning |
|--------|---------|
| ✅ | All checks green |
| ❌ | Real failure — needs investigation before review |
| ⏳ | CI running |
| ❓ | No CI result yet (doc-only, draft, or external PR) |
| ⚠️ | Non-blocking failure (e.g. macOS/Windows `continue-on-error`, Codacy ACTION_REQUIRED — maintainer overrides in UI) |

---

## Dependency chains — land in this order

```
#121 consolidate/main-hygiene-batch (revert single-tz + sync MEOS API drift; subsumes #116+#118)
└─► #111 fix/per-thread-meos-init (thread-safety foundation)
└─► #58 fix/splitnspans-spanset-result + aggregates batch (12 commits)
└─► #61 fix/geomset-srid-parameter
└─► #106 fix/span-arithmetic-correctness
└─► #107 fix/span-distance-return-types
└─► consolidate/ batch (#97–#105) (parity surface — independent of each other)
└─► #108 feat/parity-math-similarity-tbox
└─► #109 feat/parity-elevation-restrict
└─► #110 feat/parity-split-complement
└─► #112 feat/wkb-roundtrip-all-types (TZ-neutral test fix landed)
└─► #113 feat/edge-to-cloud-quickstart
└─► #114 feat/berlinmod-geo-functions2
└─► #126 feat/parity-additions-batch (bearing + covers + stbox-dim + seqSetGaps; subsumes #122+#123+#124+#125)
└─► #120 consolidate/pr-coordination-and-tz-lint (subsumes #115+#119)
└─► #117 doc/reviewer-guide (visibility wiring; cross-repo with MobilityDB #931 / MobilitySpark #8)
```

**#121 should land first** — it reverts single-timezone state on `main` and syncs MEOS API drift, unblocking every other branch from local-build failures. Then **#111** (per-thread MEOS init) is the thread-safety foundation all parity work builds on.

The **consolidate/** PRs (#97–#105) are independent parity drops covering different function families; they can land in any order once the four correctness fixes (#58, #61, #106, #107) and #111 are in.

---

## Tier 1 — Merge immediately (bug fixes + visibility, trivially reviewable)

| PR | Branch | Description | CI |
|----|--------|-------------|----|
| #117 | `doc/reviewer-guide` | **This guide** — PR review ordering, tiers, dependency chains; visibility wiring (PR template + README banner) | ✅ |
| #121 | `consolidate/main-hygiene-batch` | Revert single-tz on main + sync MEOS API drift (subsumes #116+#118); unblocks every other branch | ✅ |
| #120 | `consolidate/pr-coordination-and-tz-lint` | docs/PR-COORDINATION.md + scripts/lint-tz-pinned-tests.py (subsumes #115+#119) | ✅ |
| #111 | `fix/per-thread-meos-init` | Replace global MEOS mutex with per-thread initialization | ✅ |
| #107 | `fix/span-distance-return-types` | Fix distance return types; add `+` / `shift` alias for tstzset/tstzspan+interval | ✅ |
| #106 | `fix/span-arithmetic-correctness` | Fix SpanSet serialization size and floatspan distance datum | ✅ |
| #61 | `fix/geomset-srid-parameter` | `set(LIST(GEOMETRY), INTEGER)` overload — explicit SRID | ✅ |
| #58 | `fix/splitnspans-spanset-result` | `splitNspans` fix on spanset + 10 aggregate-additions (12-commit rolling-topic, scope-creep tolerated) | ✅ |

---

## Tier 2 — Parity surface — consolidate/ batch (independent, all CI green)

These cover different function families and can land in any order.

| PR | Branch | Description | CI |
|----|--------|-------------|----|
| #105 | `consolidate/docs` | CONTRIBUTING.md + PARITY.md user guide + PARITY-INVENTORY.md | ✅ |
| #104 | `consolidate/geo-types-parity` | tgeometry + tgeography + tgeogpoint — full parity surface | ✅ |
| #100 | `consolidate/analytics-parity` | Temporal analytics parity — simplify / similarity / tnumber math | ✅ |
| #98 | `consolidate/spatial-predicates-parity` | tspatial predicates parity — topological / comparison / position | ✅ |
| #97 | `consolidate/temporal-ops-parity` | Temporal ops parity — boxops / comparison / position / precision / same | ✅ |
| #103 | `consolidate/aggregates-parity` | Aggregate functions parity — extent / SkipList aggregates / tCentroid | ❌ |
| #102 | `consolidate/tiles-bins-parity` | Tile and bin functions parity — emitters / table functions / getters | ❌ |
| #99 | `consolidate/tgeompoint-ops-parity` | tgeompoint operations parity — distance / affine / transforms / geoMeasure | ❌ |

---

## Tier 3 — Recent feature additions (land after consolidate/ batch)

| PR | Branch | Description | CI | Notes |
|----|--------|-------------|----|----|
| #126 | `feat/parity-additions-batch` | bearing + eCovers/tCovers + stbox dim + seqSetGaps (subsumes #122+#123+#124+#125) | ✅ | |
| #114 | `feat/berlinmod-geo-functions2` | nearestApproachDistance, expandSpace, `&&` for TGEOMPOINT | ✅ | |
| #113 | `feat/edge-to-cloud-quickstart` | Edge-to-cloud quickstart, temporalFooter(), SRID/geodetic fix, tgeogpoint tests | ✅ | |
| #110 | `feat/parity-split-complement` | timeSplit / valueSplit / quadSplit emitters | ✅ | |
| #109 | `feat/parity-elevation-restrict` | atElevation / minusElevation via public MEOS primitives | ✅ | |
| #108 | `feat/parity-math-similarity-tbox` | Unskip tnumber math, tbox, and similarity parity tests | ✅ | |
| #112 | `feat/wkb-roundtrip-all-types` | Complete binary + hex-WKB round-trip I/O for all types (TZ-neutral test fix landed) | ✅ | |

---

## Review checklist

For every MobilityDuck PR, verify:

- [ ] PostgreSQL License header on every new `.cpp` / `.hpp` file
- [ ] New function registered in the correct `RegisterXxx()` function
- [ ] SQL name matches MobilityDB alias (RFC #861 portable SQL contract)
- [ ] NULL input handled (returns NULL or appropriate default)
- [ ] DBL\_MAX sentinel from MEOS mapped to NULL for distance functions
- [ ] New parity test added in `test/` with `nosort` tag where result order is non-deterministic
- [ ] CI green before requesting merge (fix ❌ PRs in-branch, not in a follow-up)
Loading
Loading