Author: rooneg
Date: Mon Mar  7 19:11:44 2005
New Revision: 156486

URL: http://svn.apache.org/viewcvs?view=rev&rev=156486
Log:
Extend the query parser so that it handles +term and -term.  Now that
we have that support change the default occur for 'lcn search' to must,
since that's what Java Lucene does.

* src/query_parser/parser.c
  (check_occur): new helper function.
  (lcn_query_parser_parse): handle +term and -term.

* src/cmdline/main.c
  (lcn_search_cmd): s/LCN_MUST/LCN_SHOULD/

Modified:
    incubator/lucene4c/trunk/src/cmdline/main.c
    incubator/lucene4c/trunk/src/query_parser/parser.c

Modified: incubator/lucene4c/trunk/src/cmdline/main.c
URL: 
http://svn.apache.org/viewcvs/incubator/lucene4c/trunk/src/cmdline/main.c?view=diff&r1=156485&r2=156486
==============================================================================
--- incubator/lucene4c/trunk/src/cmdline/main.c (original)
+++ incubator/lucene4c/trunk/src/cmdline/main.c Mon Mar  7 19:11:44 2005
@@ -188,7 +188,7 @@
       LCN_ERR (lcn_query_parser_create (&parser,
                                         lcn_str_from_cstring ("contents",
                                                               pool),
-                                        LCN_MUST,
+                                        LCN_SHOULD,
                                         pool));
 
       LCN_ERR (lcn_query_parser_parse (&query,

Modified: incubator/lucene4c/trunk/src/query_parser/parser.c
URL: 
http://svn.apache.org/viewcvs/incubator/lucene4c/trunk/src/query_parser/parser.c?view=diff&r1=156485&r2=156486
==============================================================================
--- incubator/lucene4c/trunk/src/query_parser/parser.c (original)
+++ incubator/lucene4c/trunk/src/query_parser/parser.c Mon Mar  7 19:11:44 2005
@@ -39,6 +39,29 @@
   return LCN_NO_ERROR;
 }
 
+lcn_boolean_clause_occur_t
+check_occur (lcn_char_t **str, lcn_boolean_clause_occur_t default_occur)
+{
+  lcn_char_t *s = *str;
+
+  switch (s[0])
+    {
+      case '+':
+        *str = ++s;
+        printf ("must\n");
+        return LCN_MUST;
+
+      case '-':
+        *str = ++s;
+        printf ("must not\n");
+        return LCN_MUST_NOT;
+
+      default:
+        printf ("should\n");
+        return default_occur;
+    }
+}
+
 lcn_error_t *
 lcn_query_parser_parse (lcn_query_t **query,
                         lcn_query_parser_t *parser,
@@ -105,14 +128,22 @@
         break;
 
       case 1:
-        LCN_ERR (lcn_term_query_create (query,
-                                        lcn_term_create (APR_ARRAY_IDX
-                                                           (terms,
-                                                            0,
-                                                            lcn_char_t *),
-                                                         parser->default_field,
-                                                         pool),
-                                        pool));
+        {
+          lcn_char_t *str = APR_ARRAY_IDX (terms, 0, lcn_char_t *);
+
+          if (str[0] == '+')
+            ++str;
+          else if (str[0] == '-')
+            return lcn_error_create
+                     (APR_EINVAL,
+                      NULL,
+                      "can't have a query with just a single negative term");
+
+          LCN_ERR (lcn_term_query_create
+                     (query,
+                      lcn_term_create (str, parser->default_field, pool),
+                      pool));
+        }
         break;
 
       default:
@@ -123,20 +154,18 @@
 
         for (idx = 0; idx < terms->nelts; ++idx)
           {
+            lcn_char_t *str = APR_ARRAY_IDX (terms, idx, lcn_char_t *);
             lcn_query_t *tq;
- 
+
+            lcn_boolean_clause_occur_t occur
+              = check_occur (&str, parser->default_occur);
+
             LCN_ERR (lcn_term_query_create
-                      (&tq,
-                       lcn_term_create (APR_ARRAY_IDX (terms,
-                                                       idx,
-                                                       lcn_char_t *),
-                                        parser->default_field,
-                                        pool),
-                       pool));
-
-            LCN_ERR (lcn_boolean_query_add (*query,
-                                            tq,
-                                            parser->default_occur));
+                       (&tq,
+                        lcn_term_create (str, parser->default_field, pool),
+                        pool));
+
+            LCN_ERR (lcn_boolean_query_add (*query, tq, occur));
           }
         break;
     }


Reply via email to