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 -- [email protected]
To unsubscribe send an email to [email protected]