From 4b302389591d666ab894971e7f873169c2fca2c8 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Thu, 31 Oct 2019 18:09:24 -0400 Subject: [PATCH] Give searchFieldTransformPredicate a special case to handle transformation of fields used in BETWEEN operations Signed-off-by: Mike Rylander --- Open-ILS/src/c-apps/oils_sql.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Open-ILS/src/c-apps/oils_sql.c b/Open-ILS/src/c-apps/oils_sql.c index ac2f054cb6..4ab98fc94d 100644 --- a/Open-ILS/src/c-apps/oils_sql.c +++ b/Open-ILS/src/c-apps/oils_sql.c @@ -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 ) { -- 2.11.0