Changeset: d5f4ed3c4d79 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5f4ed3c4d79
Modified Files:
monetdb5/extras/rdf/rdf.h
monetdb5/extras/rdf/rdfalgebra.c
monetdb5/extras/rdf/rdfalgebra.mal
sql/backends/monet5/sql.c
sql/backends/monet5/sql_rdf.h
Branch: rdf
Log Message:
Add rdf merge-join algorithm for the experiment
diffs (135 lines):
diff --git a/monetdb5/extras/rdf/rdf.h b/monetdb5/extras/rdf/rdf.h
--- a/monetdb5/extras/rdf/rdf.h
+++ b/monetdb5/extras/rdf/rdf.h
@@ -69,6 +69,9 @@ rdf_export str
RDFexception_join(bat *ret1, bat *ret2, bat *sdense, bat *o1, bat *s2, bat
*o2, bat *scand);
rdf_export str
+RDFdense_join(bat *ret1, bat *ret2, bat *sdenseid, bat *o1id, bat *scandid);
+
+rdf_export str
RDFmerge_join(bat *ret1, bat *ret2, bat *s1id, bat *o1id, bat *scandid);
#define RDF_MIN_LITERAL (((oid) 1) << ((sizeof(oid)==8)?59:27))
diff --git a/monetdb5/extras/rdf/rdfalgebra.c b/monetdb5/extras/rdf/rdfalgebra.c
--- a/monetdb5/extras/rdf/rdfalgebra.c
+++ b/monetdb5/extras/rdf/rdfalgebra.c
@@ -216,6 +216,80 @@ RDFexception_join(bat *ret1, bat *ret2,
}
/*
+ * This function performs the join given the set of S candidates with a dense
S column
+ * NO exception handling
+ * Input:
+ * - S1 BAT (dense bat), o1 BAT
+ * */
+str
+RDFdense_join(bat *ret1, bat *ret2, bat *sdenseid, bat *o1id, bat *scandid){
+ BAT *resS = NULL, *resO = NULL;
+ BAT *sdense, *o1, *scand;
+ oid *sdensept, *o1pt, *scandpt, *resSpt, *resOpt;
+ BUN estimate = 0;
+ int cnt1 = 0, cntcand = 0;
+ int i = 0;
+ BUN min_sdense, max_sdense;
+ int rescnt = 0;
+
+ if ((sdense = BATdescriptor(*sdenseid)) == NULL) {
+ throw(MAL, "rdf.RDFexception_join", RUNTIME_OBJECT_MISSING);
+ }
+ if ((o1 = BATdescriptor(*o1id)) == NULL) {
+ BBPunfix(sdense->batCacheid);
+ throw(MAL, "rdf.RDFexception_join", RUNTIME_OBJECT_MISSING);
+ }
+ if ((scand = BATdescriptor(*scandid)) == NULL) {
+ BBPunfix(sdense->batCacheid);
+ BBPunfix(o1->batCacheid);
+ throw(MAL, "rdf.RDFexception_join", RUNTIME_OBJECT_MISSING);
+ }
+
+ sdensept = (oid *) Tloc(sdense, BUNfirst(sdense));
+ o1pt = (oid *) Tloc(o1, BUNfirst(o1));
+ scandpt = (oid *) Tloc(scand, BUNfirst(scand));
+
+ /*Estimate the total size of the output = the size of
+ the candidate BAT and the exception BAT */
+
+ estimate = BATcount(scand);
+
+ resS = BATnew(TYPE_void, TYPE_oid, estimate, TRANSIENT);
+ resO = BATnew(TYPE_void, TYPE_oid, estimate, TRANSIENT);
+ resSpt = (oid *) Tloc(resS, BUNfirst(resS));
+ resOpt = (oid *) Tloc(resO, BUNfirst(resO));
+
+ cnt1 = (int) BATcount(sdense);
+ cntcand = (int) BATcount(scand);
+ min_sdense = sdensept[0];
+ max_sdense = sdensept[cnt1-1];
+
+ i = 0;
+ //printf("Number of cand = %d | Number of input = %d | Number of
exception = %d\n", cntcand, cnt1, cnt2);
+
+ while (i < cntcand){
+ //fetch the result from dense
+ if (scandpt[i] >= min_sdense && scandpt[i] <= max_sdense){
+ resSpt[rescnt] = scandpt[i];
+ resOpt[rescnt] = o1pt[scandpt[i] - min_sdense];
+ rescnt++;
+ }
+ i++;
+ }
+
+ //printf("Number of results %d\n", rescnt);
+ BATsetcount(resS,rescnt);
+ BATsetcount(resO,rescnt);
+ *ret1 = resS->batCacheid;
+ *ret2 = resO->batCacheid;
+ BBPkeepref(*ret1);
+ BBPkeepref(*ret2);
+
+ return MAL_SUCCEED;
+}
+
+
+/*
* This function performs the join given the set of S candidates with a S
column
* considering the exception data.
* Input:
diff --git a/monetdb5/extras/rdf/rdfalgebra.mal
b/monetdb5/extras/rdf/rdfalgebra.mal
--- a/monetdb5/extras/rdf/rdfalgebra.mal
+++ b/monetdb5/extras/rdf/rdfalgebra.mal
@@ -33,6 +33,10 @@ command rdf_exception_join(s1:bat[:oid],
address RDFexception_join
comment "Union join with the input consists of a dense S bat and an exception
S. The output are two BATs S and O of satisfied S and corresponding O's"
+command rdf_dense_join(s1:bat[:oid], o1:bat[:oid],
scand:bat[:oid])(:bat[:oid],:bat[:oid])
+address RDFdense_join
+comment "Join with dense gAT. s1 is the dense BAT"
+
command rdf_merge_join(s1:bat[:oid], o1:bat[:oid],
scand:bat[:oid])(:bat[:oid],:bat[:oid])
address RDFmerge_join
comment "Merge join between a set of candidate S's and . The output are two
BATs S and O of statisfied S and corresponding O's"
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -177,7 +177,9 @@ sql_symbol2relation(mvc *c, symbol *sym)
#endif
eT = clock();
printf("----- Optimization time: %f mseconds.\n",
1000*((float)(eT - sT))/CLOCKS_PER_SEC);
-
+ #if ONLY_COMPUTE_OPT_TIME
+ return NULL;
+ #endif
}
}
return r;
diff --git a/sql/backends/monet5/sql_rdf.h b/sql/backends/monet5/sql_rdf.h
--- a/sql/backends/monet5/sql_rdf.h
+++ b/sql/backends/monet5/sql_rdf.h
@@ -89,4 +89,6 @@ extern int need_handling_exception;
#define PRINT_FOR_DEBUG 0
+#define ONLY_COMPUTE_OPT_TIME 0
+
#endif /*_SQL_RDF_H */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list