Changeset: 285afea1c28b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/285afea1c28b Modified Files: geom/monetdb5/geod.c Branch: geo-update Log Message:
Merged geo-update-dev into geo-update. diffs (truncated from 2338 to 300 lines): diff --git a/cmake/Modules/FindRTree.cmake b/cmake/Modules/FindRTree.cmake new file mode 100644 --- /dev/null +++ b/cmake/Modules/FindRTree.cmake @@ -0,0 +1,30 @@ +# - Find RTree +# Find the native rtree headers and libraries. +# +# RTREE_INCLUDE_DIR - where to find rtree.h. +# RTREE_LIBRARY - where to find rtree library. +# RTREE_FOUND - True if rtree found. + +# Look for the header file. +find_path(RTREE_INCLUDE_DIR NAMES rtree.h) + +# Look for the library. +find_library(RTREE_LIBRARY NAMES librtree.a) + +# Handle the QUIETLY and REQUIRED arguments and set RTREE_FOUND to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(RTree REQUIRED_VARS RTREE_LIBRARY RTREE_INCLUDE_DIR) + +if(RTREE_FOUND AND NOT TARGET rtree:rtree) + add_library(rtree::rtree UNKNOWN IMPORTED) + set_target_properties(rtree::rtree + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${RTREE_INCLUDE_DIR}") + set_target_properties(rtree::rtree + PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${RTREE_LIBRARY}") +endif() + +mark_as_advanced(RTREE_INCLUDE_DIR RTREE_LIBRARIES) diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake --- a/cmake/monetdb-defines.cmake +++ b/cmake/monetdb-defines.cmake @@ -148,6 +148,7 @@ macro(monetdb_macro_variables) set(RHOME "${LIBR_HOME}") set(HAVE_GEOM ${GEOS_FOUND}) set(HAVE_SHP ${GDAL_FOUND}) + set(HAVE_RTREE ${RTREE_FOUND}) if(PY3INTEGRATION) set(HAVE_LIBPY3 "${Python3_NumPy_FOUND}") diff --git a/cmake/monetdb-findpackages.cmake b/cmake/monetdb-findpackages.cmake --- a/cmake/monetdb-findpackages.cmake +++ b/cmake/monetdb-findpackages.cmake @@ -18,6 +18,10 @@ else() find_package(Python3 COMPONENTS Interpreter Development NumPy) endif() +if(WITH_RTREE) + find_package(RTree) +endif() + if(WITH_LZMA) find_package(Lzma) endif() diff --git a/cmake/monetdb-options.cmake b/cmake/monetdb-options.cmake --- a/cmake/monetdb-options.cmake +++ b/cmake/monetdb-options.cmake @@ -27,6 +27,10 @@ cmake_dependent_option(CINTEGRATION "NOT WIN32" OFF) +option(WITH_RTREE + "Enable support for rtrees (librtree; default=ON)" + ON) + option(PY3INTEGRATION "Enable support for Python 3 integration into MonetDB (default=ON)" ON) diff --git a/gdk/CMakeLists.txt b/gdk/CMakeLists.txt --- a/gdk/CMakeLists.txt +++ b/gdk/CMakeLists.txt @@ -86,6 +86,7 @@ target_sources(bat gdk_analytic.h gdk_tracer.c gdk_tracer.h gdk_strimps.c + gdk_rtree.c PUBLIC ${gdk_public_headers}) @@ -94,6 +95,7 @@ target_include_directories(bat $<TARGET_PROPERTY:stream,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:matomic,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:mstring,INTERFACE_INCLUDE_DIRECTORIES> + $<$<BOOL:${RTREE_FOUND}>:$<TARGET_PROPERTY:rtree::rtree,INTERFACE_INCLUDE_DIRECTORIES>> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb>) @@ -105,6 +107,7 @@ target_link_libraries(bat monetdb_config_header moptions mutils + $<$<BOOL:${RTREE_FOUND}>:rtree::rtree> $<$<NOT:$<PLATFORM_ID:Windows>>:m> $<$<PLATFORM_ID:Windows>:ws2_32> $<$<BOOL:${KVM_FOUND}>:KVM::KVM> diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -351,6 +351,13 @@ gdk_export _Noreturn void GDKfatal(_In_z #include "stream.h" #include "mstring.h" +#ifdef HAVE_RTREE +#ifndef SIZEOF_RTREE_COORD_T +#define SIZEOF_RTREE_COORD_T 4 +#endif +#include <rtree.h> +#endif + #undef MIN #undef MAX #define MAX(A,B) ((A)<(B)?(B):(A)) @@ -580,6 +587,10 @@ typedef struct Hash Hash; typedef struct Imprints Imprints; typedef struct Strimps Strimps; +#ifdef HAVE_RTREE +typedef struct RTree RTree; +#endif + /* * @+ Binary Association Tables * Having gone to the previous preliminary definitions, we will now @@ -740,6 +751,9 @@ typedef struct { BUN baseoff; /* offset in heap->base (in whole items) */ Heap *vheap; /* space for the varsized data. */ Hash *hash; /* hash table */ +#ifdef HAVE_RTREE + RTree *rtree; /* rtree geometric index */ +#endif Imprints *imprints; /* column imprints index */ Heap *orderidx; /* order oid index */ Strimps *strimps; /* string imprint index */ @@ -835,7 +849,9 @@ typedef struct BAT { #define timprints T.imprints #define tprops T.props #define tstrimps T.strimps - +#ifdef HAVE_RTREE +#define trtree T.rtree +#endif /* some access functions for the bitmask type */ static inline void @@ -1854,6 +1870,28 @@ gdk_export void STRMPdestroy(BAT *b); gdk_export bool BAThasstrimps(BAT *b); gdk_export gdk_return BATsetstrimps(BAT *b); +/* Rtree structure functions */ +#ifdef HAVE_RTREE +//TODO REMOVE +typedef struct mbr_t { + float xmin; + float ymin; + float xmax; + float ymax; + +} mbr_t; + +gdk_export bool RTREEexists(BAT *b); +gdk_export bool RTREEexists_bid(bat *bid); +gdk_export gdk_return BATrtree(BAT *wkb, BAT* mbr); +gdk_export BUN* RTREEsearch(BAT *b, mbr_t *inMBR, int result_limit); +gdk_export void RTREEdecref(BAT *b); +gdk_export void RTREEincref(BAT *b); +#endif + +gdk_export void RTREEdestroy(BAT *b); +gdk_export void RTREEfree(BAT *b); + /* The ordered index structure */ gdk_export gdk_return BATorderidx(BAT *b, bool stable); diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c --- a/gdk/gdk_align.c +++ b/gdk/gdk_align.c @@ -338,6 +338,7 @@ VIEWdestroy(BAT *b) IMPSdestroy(b); OIDXdestroy(b); STRMPdestroy(b); + RTREEdestroy(b); MT_lock_set(&b->theaplock); PROPdestroy_nolock(b); diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -587,6 +587,7 @@ BATclear(BAT *b, bool force) IMPSdestroy(b); OIDXdestroy(b); STRMPdestroy(b); + RTREEdestroy(b); PROPdestroy(b); /* we must dispose of all inserted atoms */ @@ -668,6 +669,7 @@ BATfree(BAT *b) IMPSfree(b); OIDXfree(b); STRMPfree(b); + RTREEfree(b); MT_lock_set(&b->theaplock); if (nunique != BUN_NONE) { b->tunique_est = (double) nunique; @@ -1284,6 +1286,7 @@ BUNappendmulti(BAT *b, const void *value IMPSdestroy(b); /* no support for inserts in imprints yet */ OIDXdestroy(b); STRMPdestroy(b); /* TODO: use STRMPappendBitstring */ + RTREEdestroy(b); return GDK_SUCCEED; } @@ -1518,6 +1521,7 @@ BUNinplacemulti(BAT *b, const oid *posit OIDXdestroy(b); IMPSdestroy(b); STRMPdestroy(b); + RTREEdestroy(b); if (b->tvheap && b->ttype) { var_t _d; diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -701,6 +701,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool IMPSdestroy(b); /* imprints do not support updates yet */ OIDXdestroy(b); STRMPdestroy(b); /* TODO: use STRMPappendBitString */ + RTREEdestroy(b); MT_lock_set(&b->theaplock); @@ -930,6 +931,7 @@ BATdel(BAT *b, BAT *d) HASHdestroy(b); PROPdestroy(b); STRMPdestroy(b); + RTREEdestroy(b); if (BATtdense(d)) { oid o = d->tseqbase; BUN c = BATcount(d); @@ -1124,6 +1126,7 @@ BATappend_or_update(BAT *b, BAT *p, cons OIDXdestroy(b); IMPSdestroy(b); STRMPdestroy(b); + RTREEdestroy(b); /* load hash so that we can maintain it */ (void) BATcheckhash(b); diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1144,6 +1144,7 @@ fixhashashbat(BAT *b) OIDXdestroy(b); PROPdestroy(b); STRMPdestroy(b); + RTREEdestroy(b); /* make backup of heaps */ const char *t; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -457,6 +457,14 @@ struct Strimps { /* bitstrings_base is a pointer to uint64_t */ }; +#ifdef HAVE_RTREE +struct RTree { + ATOMIC_TYPE refs; /* counter for logical references to the rtree */ + rtree_t *rtree; /* rtree structure */ + bool destroy; /* destroy rtree when there are no more logical references */ +}; +#endif + typedef struct { MT_Lock swap; } batlock_t; diff --git a/gdk/gdk_rtree.c b/gdk/gdk_rtree.c new file mode 100644 --- /dev/null +++ b/gdk/gdk_rtree.c @@ -0,0 +1,361 @@ +#include "monetdb_config.h" +#include "gdk.h" +#include "gdk_private.h" + +//TODO Check if we need to input RTREEdestroy into drop_index func in sql_cat.c +//TODO Should you check if the parent BAT is null? + +//TODO Re-check the conditions +/* Conditions to persist the RTree: + * - BAT has to be persistent + * - No deleted rows (when does batInserted update?) + * - The heap is not dirty -> no new values + * - DB Farm is persistent i.e. not in memory + */ _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org