Give searchFieldTransformPredicate a special case to handle transformation of fields...
authorMike Rylander <mrylander@gmail.com>
Thu, 31 Oct 2019 22:09:24 +0000 (18:09 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Thu, 16 Jan 2020 21:38:28 +0000 (16:38 -0500)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/c-apps/oils_sql.c

index ac2f054..4ab98fc 100644 (file)
@@ -85,6 +85,7 @@ static char* searchFunctionPredicate ( const char*, osrfHash*, const jsonObject*
 static char* searchFieldTransform ( const char*, osrfHash*, const jsonObject* );
 static char* searchFieldTransformPredicate ( const ClassInfo*, osrfHash*, const jsonObject*,
                const char* );
+static char* searchBETWEENRange( osrfHash* field, const jsonObject* node );
 static char* searchBETWEENPredicate ( const char*, osrfHash*, const jsonObject* );
 static char* searchINPredicate ( const char*, osrfHash*,
                                                                 jsonObject*, const char*, osrfMethodContext* );
@@ -3019,7 +3020,11 @@ static char* searchFieldTransformPredicate( const ClassInfo* class_info, osrfHas
                }
                extra_parens = 1;
        } else if( value_obj->type == JSON_ARRAY ) {
-               value = searchValueTransform( value_obj );
+               if ( !strcmp("between",op)) { // special case, for transforming the field and passing start/end to BETWEEN
+                       value = searchBETWEENRange( field, value_obj );
+               } else {
+                       value = searchValueTransform( value_obj );
+               }
                if( !value ) {
                        osrfLogError( OSRF_LOG_MARK,
                                "%s: Error building value transform for field transform", modulename );
@@ -3156,8 +3161,7 @@ static char* searchSimplePredicate( const char* op, const char* class_alias,
        return pred;
 }
 
-static char* searchBETWEENPredicate( const char* class_alias,
-               osrfHash* field, const jsonObject* node ) {
+static char* searchBETWEENRange( osrfHash* field, const jsonObject* node ) {
 
        const jsonObject* x_node = jsonObjectGetIndex( node, 0 );
        const jsonObject* y_node = jsonObjectGetIndex( node, 1 );
@@ -3192,14 +3196,28 @@ static char* searchBETWEENPredicate( const char* class_alias,
        }
 
        growing_buffer* sql_buf = buffer_init( 32 );
-       buffer_fadd( sql_buf, "\"%s\".%s BETWEEN %s AND %s",
-                       class_alias, osrfHashGet( field, "name" ), x_string, y_string );
+       buffer_fadd( sql_buf, "BETWEEN %s AND %s", x_string, y_string );
        free( x_string );
        free( y_string );
 
        return buffer_release( sql_buf );
 }
 
+static char* searchBETWEENPredicate( const char* class_alias,
+               osrfHash* field, const jsonObject* node ) {
+
+       char* between_range = searchBETWEENRange(field, node)
+
+       if( NULL == between_range )
+               return NULL;
+
+       growing_buffer* sql_buf = buffer_init( 32 );
+       buffer_fadd( sql_buf, "\"%s\".%s %s",
+                       class_alias, osrfHashGet( field, "name" ), between_range);
+
+       return buffer_release( sql_buf );
+}
+
 static char* searchPredicate( const ClassInfo* class_info, osrfHash* field,
                                                          jsonObject* node, osrfMethodContext* ctx ) {