Merge branch 'yaz-621-optimized'
[yaz-moved-to-github.git] / src / rpn2solr.c
index 6e41001..5047d4b 100644 (file)
@@ -69,15 +69,15 @@ static const char *lookup_relation_index_from_attr(Z_AttributeList *attributes)
                 {
                     /* Unsure on whether this is the relation attribute constants? */
                 case Z_ProximityOperator_Prox_lessThan:
-                    return 0;
+                    return "<";
                 case Z_ProximityOperator_Prox_lessThanOrEqual:
-                    return 0;
+                    return "le";
                 case Z_ProximityOperator_Prox_equal:
                     return ":";
                 case Z_ProximityOperator_Prox_greaterThanOrEqual:
-                    return 0;
+                    return "ge";
                 case Z_ProximityOperator_Prox_greaterThan:
-                    return 0;
+                    return ">";
                 case Z_ProximityOperator_Prox_notEqual:
                     return 0;
                 case 100:
@@ -159,12 +159,12 @@ static int rpn2solr_attr(solr_transform_t ct,
                 solr_attr->close = "]";
             }
             else if (!strcmp(relation, "ge")) {
-                solr_attr->is_range = 3;
+                solr_attr->is_range = 4;
                 solr_attr->begin = "[";
                 solr_attr->close = " TO *]";
             }
             else if (!strcmp(relation, ">")) {
-                solr_attr->is_range = 4;
+                solr_attr->is_range = 5;
                 solr_attr->begin = "{";
                 solr_attr->close = " TO *]";
             }
@@ -351,10 +351,12 @@ static int solr_write_and_or_range(void (*pr)(const char *buf, void *client_data
 {
     if (solr_attr_left->is_range && 
         solr_attr_right->is_range && 
-        !strcmp(solr_attr_left->index, solr_attr_left->index)) 
+        !strcmp(solr_attr_left->index, solr_attr_right->index)) 
     {
-        if (solr_attr_left->is_range >= 3 && solr_attr_right->is_range <= 2)
+        if (solr_attr_left->is_range > 3 && solr_attr_right->is_range < 3)
             return solr_write_range(pr, client_data, solr_attr_left, solr_attr_right); 
+        else if (solr_attr_left->is_range < 3 && solr_attr_right->is_range > 3)
+            return solr_write_range(pr, client_data, solr_attr_right, solr_attr_left); 
     }
     solr_write_structure(pr, client_data, solr_attr_left);
     pr(" AND ", client_data);
@@ -384,23 +386,22 @@ static int rpn2solr_structure(solr_transform_t ct,
     {
         Z_Operator *op = q->u.complex->roperator;
         int r;
+        struct solr_attr solr_attr_left, solr_attr_right;
+        WRBUF w_left = wrbuf_alloc();
+        WRBUF w_right = wrbuf_alloc();
 
         if (nested)
             pr("(", client_data);
 
-        struct solr_attr solr_attr_left;
         solr_attr_init(&solr_attr_left);
-        WRBUF w_left = wrbuf_alloc();
-        r = rpn2solr_structure(ct, pr, client_data, q->u.complex->s1, 1, w_left, &solr_attr_left); 
+        r = rpn2solr_structure(ct, pr, client_data, q->u.complex->s1, 1, w_left, &solr_attr_left);
 
 
         if (r) {
             wrbuf_destroy(w_left);
             return r;
-        }       
-        struct solr_attr solr_attr_right;
+        }
         solr_attr_init(&solr_attr_right);
-        WRBUF w_right = wrbuf_alloc();
 
         r = rpn2solr_structure(ct, pr, client_data, q->u.complex->s2, 1, w_right, &solr_attr_right);
         if (r) {
@@ -408,7 +409,7 @@ static int rpn2solr_structure(solr_transform_t ct,
             wrbuf_destroy(w_right);
             return r;
         }
-            
+
         switch(op->which)
         {
         case  Z_Operator_and:
@@ -448,8 +449,8 @@ int solr_transform_rpn2solr_stream(solr_transform_t ct,
 {
     int r;
     WRBUF w = wrbuf_alloc();
-    solr_transform_set_error(ct, 0, 0);
     struct solr_attr solr_attr;
+    solr_transform_set_error(ct, 0, 0);
     solr_attr_init(&solr_attr);
     r = rpn2solr_structure(ct, pr, client_data, q->RPNStructure, 0, w, &solr_attr);
     solr_write_structure(pr, client_data, &solr_attr);