Changeset: 331d6461d586 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=331d6461d586
Modified Files:
        monetdb5/extras/rdf/rdf.h
        monetdb5/extras/rdf/rdfalgebra.c
        monetdb5/extras/rdf/rdfalgebra.mal
        monetdb5/extras/rdf/rdfschema.c
        monetdb5/extras/rdf/rdfschema.h
        monetdb5/extras/rdf/rdfschema.mal
Branch: rdf
Log Message:

Add a function for outter joining the an input bat and a mapping bat, but for 
non-matching value use the original value from input bat instead of nil value.


diffs (truncated from 371 to 300 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
@@ -53,6 +53,11 @@ RDFleftfetchjoin_sorted(int *result, int
 rdf_export str 
 TKNZRrdf2str (bat *res, bat *bid, bat *map);
 
+rdf_export str
+RDFpartialjoin (bat *res, bat *lmap, bat *rmap, bat *input); 
+
+
+
 #define RDF_MIN_LITERAL (((oid) 1) << ((sizeof(oid)==8)?59:27))
 
 typedef enum {
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
@@ -54,6 +54,62 @@ RDFleftfetchjoin_sorted(bat *result, bat
 
 
 str
+RDFpartialjoin(bat *retid, bat *lid, bat *rid, bat *inputid){
+       BAT *left, *right, *result, *map, *input;  
+       BATiter resulti,inputi;
+       BUN     p,q; 
+       oid     *rbt; 
+       oid     *ibt; 
+       
+
+       if ((left = BATdescriptor(*lid)) == NULL) {
+               throw(MAL, "rdf.RDFpartialjoin", RUNTIME_OBJECT_MISSING);
+       }
+       if ((right = BATdescriptor(*rid)) == NULL) {
+               BBPreleaseref(left->batCacheid);
+               throw(MAL, "rdf.RDFpartialjoin", RUNTIME_OBJECT_MISSING);
+       }
+
+       if ((input = BATdescriptor(*inputid)) == NULL) {
+               BBPreleaseref(left->batCacheid);
+               BBPreleaseref(right->batCacheid);
+               throw(MAL, "rdf.RDFpartialjoin", RUNTIME_OBJECT_MISSING);
+       }
+       //result = BATouterjoin(left, right, BUN_NONE);
+       map = BATleftfetchjoin(BATmirror(left), right, BUN_NONE);
+
+       BBPreleaseref(left->batCacheid);
+       BBPreleaseref(right->batCacheid);
+
+       //BATprint(map); 
+
+       result = BATouterjoin(input, map, BUN_NONE); 
+
+       resulti = bat_iterator(result);
+       inputi = bat_iterator(input);
+
+       BATloop(result, p, q){
+               rbt = (oid *) BUNtloc(resulti, p); 
+               if (*rbt == oid_nil){
+                       ibt = (oid *) BUNtloc(inputi, p); 
+                       *rbt = *ibt; 
+               }
+       }
+
+       BBPreleaseref(input->batCacheid);
+
+       //BATprint(result); 
+       if (result == NULL)
+               throw(MAL, "rdf.RDFpartialjoin", GDK_EXCEPTION);
+
+       *retid = result->batCacheid; 
+       BBPkeepref(*retid); 
+
+       return MAL_SUCCEED; 
+}
+
+
+str
 TKNZRrdf2str(bat *res, bat *bid, bat *map)
 {
        BAT *r, *b, *m;
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
@@ -24,3 +24,8 @@ comment "like algebra_leftfetchjoin(), b
 command rdf2str(i:bat[:oid,:oid],map:bat[:oid,:str]):bat[:oid,:str]
 address TKNZRrdf2str
 comment "converts id's into strings using the dictionary, but if (id >= 
RDF_MIN_LITERAL) look it up in a literal map bat";
+
+command partialjoin(lmap:bat[:oid, :any_1], rmap:bat[:oid, :any_2], 
input:bat[:oid,:any_1]):bat[:any_1,:any_2]
+address RDFpartialjoin
+comment "Join the input bat and the map bat (lmap, rmap). However, do not use 
nil for non-matching value but use the original value from input bat"
+
diff --git a/monetdb5/extras/rdf/rdfschema.c b/monetdb5/extras/rdf/rdfschema.c
--- a/monetdb5/extras/rdf/rdfschema.c
+++ b/monetdb5/extras/rdf/rdfschema.c
@@ -2619,17 +2619,14 @@ void printCSmergeRel(CSset *freqCSset, C
 
 /* Extract CS from SPO triples table */
 str
-RDFextractCSwithTypes(int *ret, bat *sbatid, bat *pbatid, bat *obatid, bat 
*mapbatid, int *freqThreshold){
+RDFextractCSwithTypes(int *ret, bat *sbatid, bat *pbatid, bat *obatid, bat 
*mapbatid, int *freqThreshold, void *_freqCSset, oid **subjCSMap, oid 
*maxCSoid){
 
        BAT             *sbat = NULL, *pbat = NULL, *obat = NULL, *mbat = NULL; 
        BATiter         si, pi, oi;     /*iterator for BAT of s,p,o columns in 
spo table */
-       CSset           *freqCSset;     /* Set of frequent CSs */
 
        CSBats          *csBats; 
-       oid             *subjCSMap;     /* Store the corresponding CS Id for 
each subject */
        oid             *subjSubCSMap;  /* Store the corresponding CS sub Id 
for each subject */
        BUN             *maxSoid;       
-       oid             maxCSoid = 0; 
        int             maxNumProp = 0;
        int             maxNumPwithDup = 0; 
        char            *csFreqMap; 
@@ -2644,7 +2641,7 @@ RDFextractCSwithTypes(int *ret, bat *sba
        int             numMaxCSs = 0; 
        oid             *superCSFreqCSMap; 
        oid             *superCSMergeMaxCSMap;
-
+       CSset           *freqCSset; 
 
        if ((sbat = BATdescriptor(*sbatid)) == NULL) {
                throw(MAL, "rdf.RDFextractCSwithTypes", RUNTIME_OBJECT_MISSING);
@@ -2676,52 +2673,53 @@ RDFextractCSwithTypes(int *ret, bat *sba
 
        csBats = initCSBats();
 
-       freqCSset = initCSset();
+       freqCSset = ((CSset *) _freqCSset); 
+
 
        maxSoid = (BUN *) Tloc(sbat, BUNlast(sbat) - 1);
        printf("Max S oid: " BUNFMT "\n", *maxSoid);
 
        assert(*maxSoid != BUN_NONE); 
 
-       subjCSMap = (oid *) malloc (sizeof(oid) * ((*maxSoid) + 1)); 
+       *subjCSMap = (oid *) malloc (sizeof(oid) * ((*maxSoid) + 1)); 
        subjSubCSMap = (oid *) malloc (sizeof(oid) * ((*maxSoid) + 1)); 
        
-       initArray(subjCSMap, (*maxSoid) + 1, BUN_NONE);
+       initArray(*subjCSMap, (*maxSoid) + 1, BUN_NONE);
 
 
        //Phase 1: Assign an ID for each CS
        #if STOREFULLCS
-       RDFassignCSId(ret, sbat, si, pi, oi, freqCSset, freqThreshold, csBats, 
subjCSMap, &maxCSoid, &maxNumProp, &maxNumPwithDup);
+       RDFassignCSId(ret, sbat, si, pi, oi, freqCSset, freqThreshold, csBats, 
*subjCSMap, maxCSoid, &maxNumProp, &maxNumPwithDup);
        #else
-       RDFassignCSId(ret, sbat, si, pi, freqCSset, freqThreshold, csBats, 
subjCSMap, &maxCSoid, &maxNumProp, &maxNumPwithDup);
+       RDFassignCSId(ret, sbat, si, pi, freqCSset, freqThreshold, csBats, 
*subjCSMap, maxCSoid, &maxNumProp, &maxNumPwithDup);
        #endif
        
 
 
        //Phase 2: Check the relationship       
 
-       printf("Max CS oid: " BUNFMT "\n", maxCSoid);
+       printf("Max CS oid: " BUNFMT "\n", *maxCSoid);
 
        printf("Max Number of P (considering duplicated P): %d \n", 
maxNumPwithDup);
 
-       csFreqMap = (char*) malloc(sizeof(char) * (maxCSoid +1)); 
-       initCharArray(csFreqMap, maxCSoid +1, 0); 
+       csFreqMap = (char*) malloc(sizeof(char) * (*maxCSoid +1)); 
+       initCharArray(csFreqMap, *maxCSoid +1, 0); 
 
 
        generateFreqCSMap(freqCSset,csFreqMap); 
 
 
-       csrelSet = initCSrelset(maxCSoid + 1);
-
-
-       csSubCSMap = initCS_SubCSMap(maxCSoid +1); 
-
-       RDFrelationships(ret, sbat, si, pi, oi, subjCSMap, subjSubCSMap, 
csSubCSMap, csrelSet, *maxSoid, maxNumPwithDup);
-
-
-       printCSrelSet(csrelSet,csFreqMap, csBats->freqBat, maxCSoid + 1, 1, 
*freqThreshold);  
-
-       printSubCSInformation(csSubCSMap, csBats->freqBat, maxCSoid + 1, 1, 
*freqThreshold); 
+       csrelSet = initCSrelset(*maxCSoid + 1);
+
+
+       csSubCSMap = initCS_SubCSMap(*maxCSoid +1); 
+
+       RDFrelationships(ret, sbat, si, pi, oi, *subjCSMap, subjSubCSMap, 
csSubCSMap, csrelSet, *maxSoid, maxNumPwithDup);
+
+
+       printCSrelSet(csrelSet,csFreqMap, csBats->freqBat, *maxCSoid + 1, 1, 
*freqThreshold);  
+
+       printSubCSInformation(csSubCSMap, csBats->freqBat, *maxCSoid + 1, 1, 
*freqThreshold); 
 
        printf("Number of frequent CSs is: %d \n", freqCSset->numCSadded);
 
@@ -2729,33 +2727,33 @@ RDFextractCSwithTypes(int *ret, bat *sba
 
        //getTopFreqCSs(csMap,*freqThreshold);
 
-       getMaximumFreqCSs(freqCSset, csBats->coverageBat,  csBats->freqBat, 
maxCSoid + 1, &numMaxCSs); 
+       getMaximumFreqCSs(freqCSset, csBats->coverageBat,  csBats->freqBat, 
*maxCSoid + 1, &numMaxCSs); 
 
        //printf("Number of maximumCS: %d", numMaxCSs);
        
        printFreqCSSet(freqCSset, csBats->freqBat, mbat, 1, *freqThreshold); 
 
 
-       csrelToMaxFreqSet = initCSrelset(maxCSoid + 1); // CS --> Reference 
MaxCSs
-       csrelFromMaxFreqSet = initCSrelset(maxCSoid + 1);       // CS --> 
Reference MaxCSs
-       csrelBetweenMaxFreqSet = initCSrelset(maxCSoid + 1);    // MaxCS --> 
Reference MaxCSs
-
-
-       csIdFreqIdxMap = (int *) malloc (sizeof(int) * (maxCSoid + 1)); 
-       initcsIdFreqIdxMap(csIdFreqIdxMap, maxCSoid + 1, -1, freqCSset);
-
-       printCSrelWithMaxSet(freqCSset, csIdFreqIdxMap, csrelToMaxFreqSet, 
csrelFromMaxFreqSet, csrelBetweenMaxFreqSet, csrelSet,csFreqMap, 
csBats->freqBat, maxCSoid + 1, *freqThreshold);  
+       csrelToMaxFreqSet = initCSrelset(*maxCSoid + 1);        // CS --> 
Reference MaxCSs
+       csrelFromMaxFreqSet = initCSrelset(*maxCSoid + 1);      // CS --> 
Reference MaxCSs
+       csrelBetweenMaxFreqSet = initCSrelset(*maxCSoid + 1);   // MaxCS --> 
Reference MaxCSs
+
+
+       csIdFreqIdxMap = (int *) malloc (sizeof(int) * (*maxCSoid + 1)); 
+       initcsIdFreqIdxMap(csIdFreqIdxMap, *maxCSoid + 1, -1, freqCSset);
+
+       printCSrelWithMaxSet(freqCSset, csIdFreqIdxMap, csrelToMaxFreqSet, 
csrelFromMaxFreqSet, csrelBetweenMaxFreqSet, csrelSet,csFreqMap, 
csBats->freqBat, *maxCSoid + 1, *freqThreshold);  
 
        superCSFreqCSMap = (oid*) malloc(sizeof(oid) * numMaxCSs); 
        superCSMergeMaxCSMap = (oid*) malloc(sizeof(oid) * numMaxCSs);
 
        //mergeMaximumFreqCSs(freqCSset, superCSFreqCSMap, 
superCSMergeMaxCSMap, mergecsSet, numMaxCSs);
 
-       mergeMaximumFreqCSsAll(freqCSset, superCSFreqCSMap, 
superCSMergeMaxCSMap, numMaxCSs, maxCSoid);
+       mergeMaximumFreqCSsAll(freqCSset, superCSFreqCSMap, 
superCSMergeMaxCSMap, numMaxCSs, *maxCSoid);
 
        csRelBetweenMergeFreqSet = (CSmergeRel *) malloc (sizeof(CSmergeRel) * 
freqCSset->numCSadded);
        initCsRelBetweenMergeFreqSet(csRelBetweenMergeFreqSet, 
freqCSset->numCSadded);
-       generateCsRelBetweenMergeFreqSet(csRelBetweenMergeFreqSet, 
csrelBetweenMaxFreqSet, maxCSoid + 1, csIdFreqIdxMap, freqCSset);
+       generateCsRelBetweenMergeFreqSet(csRelBetweenMergeFreqSet, 
csrelBetweenMaxFreqSet, *maxCSoid + 1, csIdFreqIdxMap, freqCSset);
        printCSmergeRel(freqCSset, csRelBetweenMergeFreqSet, *freqThreshold);
 
        printmergeCSSet(freqCSset, *freqThreshold);
@@ -2769,23 +2767,21 @@ RDFextractCSwithTypes(int *ret, bat *sba
        BBPreclaim(obat);
        BBPreclaim(mbat);
 
-       free (subjCSMap); 
        free (subjSubCSMap);
        free (csFreqMap);
        free (superCSFreqCSMap);
        free (superCSMergeMaxCSMap); 
 
-       freeCS_SubCSMapSet(csSubCSMap, maxCSoid + 1); 
+       freeCS_SubCSMapSet(csSubCSMap, *maxCSoid + 1); 
 
        free(csIdFreqIdxMap); 
        free(csRelBetweenMergeFreqSet);
-       freeCSrelSet(csrelSet, maxCSoid + 1); 
-       freeCSrelSet(csrelToMaxFreqSet, maxCSoid + 1); 
-       freeCSrelSet(csrelBetweenMaxFreqSet, maxCSoid + 1);  
+       freeCSrelSet(csrelSet, *maxCSoid + 1); 
+       freeCSrelSet(csrelToMaxFreqSet, *maxCSoid + 1); 
+       freeCSrelSet(csrelBetweenMaxFreqSet, *maxCSoid + 1);  
 
        freeCSBats(csBats);
 
-       freeCSset(freqCSset); 
 
 
        //testBatHash(); 
@@ -2868,3 +2864,65 @@ RDFextractPfromPSO(int *ret, bat *pbatid
        return MAL_SUCCEED; 
 
 }
+
+
+str
+RDFreorganize(int *ret, bat *sbatid, bat *pbatid, bat *obatid, bat *mapbatid, 
int *freqThreshold){
+
+       CSset           *freqCSset;     /* Set of frequent CSs */
+       oid             *subjCSMap = NULL;      /* Store the corresponding CS 
Id for each subject */
+       oid             *csFreqCSMap;   
+       int             i; 
+       oid             maxCSoid = 0; 
+       BAT             *sbat = NULL;
+       BATiter         si; 
+       BUN             p,q; 
+       BAT             *sNewBat; 
+       BUN             newId; 
+       oid             *sbt; 
+
+       freqCSset = initCSset();
+
+       if (RDFextractCSwithTypes(ret, sbatid, pbatid, obatid, mapbatid, 
freqThreshold, freqCSset,&subjCSMap, &maxCSoid) != MAL_SUCCEED){
+               throw(RDF, "rdf.RDFreorganize", "Problem in extracting CSs");
+       } 
+       
+       printf("Start re-organizing triple store \n");
+       csFreqCSMap = (oid *) malloc (sizeof (oid) * maxCSoid); 
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to