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

Reply via email to