From: miker Date: Sun, 28 Jan 2007 18:40:24 +0000 (+0000) Subject: making join logic automatic where possible X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=5c6764fa5a07b6abdae644fe642080559bfb6c5d;p=Evergreen.git making join logic automatic where possible git-svn-id: svn://svn.open-ils.org/ILS/trunk@6827 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/src/c-apps/oils_cstore.c b/Open-ILS/src/c-apps/oils_cstore.c index 95e5f06274..7f725b314b 100644 --- a/Open-ILS/src/c-apps/oils_cstore.c +++ b/Open-ILS/src/c-apps/oils_cstore.c @@ -1307,9 +1307,8 @@ join : { char* searchJOIN ( jsonObject* join_hash, osrfHash* leftmeta ) { - char* leftclass = osrfHashGet(leftmeta, "classname"); - growing_buffer* join_buf = buffer_init(128); + char* leftclass = osrfHashGet(leftmeta, "classname"); jsonObjectNode* snode = NULL; jsonObjectIterator* search_itr = jsonNewObjectIterator( join_hash ); @@ -1327,6 +1326,85 @@ char* searchJOIN ( jsonObject* join_hash, osrfHash* leftmeta ) { jsonObject* filter = jsonObjectGetKey( snode->item, "filter" ); jsonObject* join_filter = jsonObjectGetKey( snode->item, "join" ); + if (field && !fkey) { + fkey = (char*)oilsIDLFindPath("/%s/links/%s/key", class, field); + if (!fkey) { + osrfLogError( + OSRF_LOG_MARK, + "%s: JOIN failed. No link defined from %s.%s to %s", + MODULENAME, + class, + field, + leftclass + ); + buffer_free(join_buf); + return NULL; + } + fkey = strdup( fkey ); + + } else if (!field && fkey) { + field = (char*)oilsIDLFindPath("/%s/links/%s/key", leftclass, fkey ); + if (!field) { + osrfLogError( + OSRF_LOG_MARK, + "%s: JOIN failed. No link defined from %s.%s to %s", + MODULENAME, + leftclass, + fkey, + class + ); + buffer_free(join_buf); + return NULL; + } + field = strdup( field ); + + } else if (!field && !fkey) { + osrfHash* _links = oilsIDLFindPath("/%s/links", leftclass); + + int i = 0; + osrfStringArray* keys = osrfHashKeys( _links ); + while ( (fkey = osrfStringArrayGetString(keys, i++)) ) { + fkey = strdup(osrfStringArrayGetString(keys, i++)); + if ( !strcmp( (char*)oilsIDLFindPath("/%s/links/%s/class", leftclass, fkey), class) ) { + field = strdup( (char*)oilsIDLFindPath("/%s/links/%s/key", leftclass, fkey) ); + break; + } else { + free(fkey); + } + } + osrfStringArrayFree(keys); + + if (!field && !fkey) { + _links = oilsIDLFindPath("/%s/links", class); + + i = 0; + keys = osrfHashKeys( _links ); + while ( (field = osrfStringArrayGetString(keys, i++)) ) { + field = strdup(osrfStringArrayGetString(keys, i++)); + if ( !strcmp( (char*)oilsIDLFindPath("/%s/links/%s/class", class, field), class) ) { + fkey = strdup( (char*)oilsIDLFindPath("/%s/links/%s/key", class, field) ); + break; + } else { + free(field); + } + } + osrfStringArrayFree(keys); + } + + if (!field && !fkey) { + osrfLogError( + OSRF_LOG_MARK, + "%s: JOIN failed. No link defined between %s and %s", + MODULENAME, + leftclass, + class + ); + buffer_free(join_buf); + return NULL; + } + + } + if (type) { if ( !strcasecmp(type,"left") ) { buffer_add(join_buf, " LEFT JOIN"); @@ -1367,11 +1445,14 @@ char* searchJOIN ( jsonObject* join_hash, osrfHash* leftmeta ) { free(jpred); } + free(type); + free(filter_op); + free(fkey); + free(field); } char* join_string = buffer_data(join_buf); buffer_free(join_buf); - return join_string; }