You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by ke...@apache.org on 2004/03/16 04:17:18 UTC

cvs commit: jakarta-lucene-sandbox/contributions/javascript/queryValidator testQueryValidator.html luceneQueryValidator.js

kelvint     2004/03/15 19:17:18

  Modified:    contributions/javascript/queryValidator
                        luceneQueryValidator.js
  Added:       contributions/javascript/queryValidator
                        testQueryValidator.html
  Log:
  Extracted validation methods so they can be tested via jsunit.
  Handles query escaping via a workaround. Yay!
  Checks for empty quotes.
  Simplified many REs.
  Allows the '=' sign.
  
  Revision  Changes    Path
  1.7       +219 -102  jakarta-lucene-sandbox/contributions/javascript/queryValidator/luceneQueryValidator.js
  
  Index: luceneQueryValidator.js
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene-sandbox/contributions/javascript/queryValidator/luceneQueryValidator.js,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- luceneQueryValidator.js	13 Jan 2004 07:01:32 -0000	1.6
  +++ luceneQueryValidator.js	16 Mar 2004 03:17:17 -0000	1.7
  @@ -1,4 +1,4 @@
  -// Author: Kelvin Tan  (kelvin@relevanz.com)
  +// Author: Kelvin Tan  (kelvint at apache.org)
   // JavaScript Lucene Query Validator
   // Version: $Id$
   // Tested: IE 6.0.2800 and Mozilla Firebird 0.7
  @@ -17,6 +17,7 @@
     wildcardCaseInsensitive = bool;
   }
   
  +// Should the user be prompted with an alert box if validation fails?
   var alertUser = true;
   
   function setAlertUser(bool)
  @@ -28,128 +29,52 @@
   // @param Form field that contains the query
   function doCheckLuceneQuery(queryField)
   {
  -  var query = queryField.value;
  +  return doCheckLuceneQueryValue(queryField.value)
  +}
  +
  +// validates a lucene query.
  +// @param query string
  +function doCheckLuceneQueryValue(query)
  +{
     if(query != null && query.length > 0)
     {
  +    query = removeEscapes(query);
  +    
       // check for allowed characters
  -    var matches = query.match(/[^a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@# ]/);
  -    if(matches != null && matches.length > 0)
  -    {
  -      if(alertUser) alert("Invalid search query! The allowed characters are a-z A-Z 0-9.  _ + - : () \" & * ? | ! {} [ ] ^ ~ \\ @ #. Please try again.")
  -      return false;
  -    }
  +    if(!checkAllowedCharacters(query)) return false;
       
  -    // check wildcards are used properly
  -    matches = query.match(/^[\*]*$|[\s]\*|^\*[^\s]/);
  -    if(matches != null && matches.length > 0)
  -    {
  -      if(alertUser) alert("Invalid search query! The wildcard (*) character must be preceded by at least one alphabet or number. Please try again.")
  -      return false;
  -    }
  +    // check * is used properly
  +    if(!checkAsterisk(query)) return false;
       
       // check for && usage
  -    // NB: doesn't handle term1 && term2 && term3 in Firebird 0.7
  -    matches = query.match(/[&]{2}/);
  -    if(matches != null && matches.length > 0)
  -    {
  -      matches = query.match(/^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+( && )?[a-zA-Z0-9_+\-:.()\"*?|!{}\[\]\^~\\@#]+[ ]*)+$/); // note missing & in pattern
  -      if(matches == null)
  -      {
  -        if(alertUser) alert("Invalid search query! Queries containing the special characters && must be in the form: term1 && term2. Please try again.")
  -        return false;
  -      }
  -    }
  +    if(!checkAmpersands(query)) return false;
       
       // check ^ is used properly 
  -    matches = query.match(/^[^\^]*$|^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\~\\@#]+(\^[\d]+)?[ ]*)+$/); // note missing ^ in pattern
  -    if(matches == null)
  -    {
  -      if(alertUser) alert("Invalid search query! The caret (^) character must be preceded by alphanumeric characters and followed by numbers. Please try again.")
  -      return false;
  -    }
  +    if(!checkCaret(query)) return false;
       
       // check ~ is used properly
  -    matches = query.match(/^[^~]*$|^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^\\@#]+(~[\d.]+)?[ ]*)+$/); // note missing ~in pattern
  -    if(matches == null)
  -    {
  -      if(alertUser) alert("Invalid search query! The tilde (~) character must be preceded by alphanumeric characters and followed by numbers. Please try again.")
  -      return false;
  -    }    
  +    if(!checkSquiggle(query)) return false;
       
       // check ! is used properly 
  -    // NB: doesn't handle term1 ! term2 ! term3
  -    matches = query.match(/^[^!]*$|^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+( ! )?[a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+[ ]*)+$/);
  -    if(matches == null || matches.length == 0)
  -    {
  -      if(alertUser) alert("Invalid search query! Queries containing the special character ! must be in the form: term1 ! term2. Please try again.")
  -      return false;
  -    }    
  +    if(!checkExclamationMark(query)) return false;
       
       // check question marks are used properly
  -    matches = query.match(/^(\?)|([^a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]\?+)/);
  -    if(matches != null && matches.length > 0)
  -    {
  -        if(alertUser) alert("Invalid search query! The question mark (?) character must be preceded by at least one alphabet or number. Please try again.")
  -      return false;
  -    }
  +    if(!checkQuestionMark(query)) return false;
       
       // check parentheses are used properly
  -    matches = query.match(/^[^()]*$|^(\([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+\))*$/);
  -    if(matches == null || matches.length == 0)
  -    {
  -      if(alertUser) alert("Invalid search query! Parentheses must be closed and contain at least one alphabet or number. Please try again.")
  -      return false;
  -    }
  -
  +    if(!checkParentheses(query)) return false;
  +    
       // check '+' and '-' are used properly      
  -    matches = query.match(/^[^\n+\-]*$|^([+-]?[a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+[ ]?)+$/);
  -    if(matches == null || matches.length == 0)
  -    {
  -      if(alertUser) alert("Invalid search query! '+' and '-' modifiers must be followed by at least one alphabet or number. Please try again.")
  -      return false;
  -    }
  +    if(!checkPlusMinus(query)) return false;
       
       // check AND, OR and NOT are used properly
  -    matches = query.match(/AND|OR|NOT/);
  -    if(matches != null && matches.length > 0)
  -    {
  -      // I've no idea why the code below doesn't work since it's identical to the exclamation mark and && RE    
  -      //matches = query.match(/^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+(?: AND )?(?: OR )?(?: NOT )?[a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+[ ]*)+$/);
  -      
  -      // we'll notify the user that this query is not validated and an error may result
  -      if(alertUser)
  -      {
  -        return confirm("Validation for queries containing AND/OR/NOT is currently not supported. If your query is not well-formed, an error may result.");
  -      }
  -      /*
  -      if(matches == null || matches.length == 0)
  -      {
  -        if(alertUser) alert("Invalid search query!  Queries containing AND/OR/NOT must be in the form: term1 AND|OR|NOT term2 Please try again.")
  -        return false;
  -      }
  -      */
  -    }
  -    
  +    if(!checkANDORNOT(query)) return false;    
       
       // check that quote marks are closed
  -    matches = query.match(/\"/g);
  -    if(matches != null && matches.length > 0)
  -    {
  -      var number = matches.length;
  -      if((number % 2) > 0)
  -      {
  -        if(alertUser) alert("Invalid search query! Please close all quote (\") marks.");
  -        return false;
  -      }
  -    }
  +    if(!checkQuotes(query)) return false;
       
       // check ':' is used properly
  -    matches = query.match(/^[^:]*$|^([a-zA-Z0-9_+\-.()\"*?&|!{}\[\]\^~\\@#]+(:[a-zA-Z0-9_+\-.()\"*?&|!{}\[\]\^~\\@#]+)?[ ]*)+$/); // note missing : in pattern
  -    if(matches == null || matches.length == 0)
  -    {
  -      if(alertUser) alert("Invalid search query! Field declarations (:) must be preceded by at least one alphabet or number and followed by at least one alphabet or number. Please try again.")
  -      return false;
  -    }
  +    if(!checkColon(query)) return false;
       
       if(wildcardCaseInsensitive)
       {
  @@ -166,7 +91,199 @@
           }
         }
       }
  -
       return true;
     }
   }
  +
  +// remove the escape character and the character immediately following it
  +function removeEscapes(query)
  +{
  +  return query.replace(/\\./g, "");
  +}
  +
  +function checkAllowedCharacters(query)
  +{
  +  matches = query.match(/[^a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#$%'= ]/);
  +  if(matches != null && matches.length > 0)
  +  {
  +    if(alertUser) alert("Invalid search query! The allowed characters are a-z A-Z 0-9.  _ + - : () \" & * ? | ! {} [ ] ^ ~ \\ @ = # % $ '. Please try again.")
  +    return false;
  +  }
  +  return true;
  +}
  +
  +function checkAsterisk(query)
  +{
  +  matches = query.match(/^[\*]*$|[\s]\*|^\*[^\s]/);
  +  if(matches != null)
  +  {
  +    if(alertUser) alert("Invalid search query! The wildcard (*) character must be preceded by at least one alphabet or number. Please try again.")
  +    return false;
  +  }
  +  return true;
  +}
  +
  +function checkAmpersands(query)
  +{
  +  // NB: doesn't handle term1 && term2 && term3 in Firebird 0.7
  +  matches = query.match(/[&]{2}/);
  +  if(matches != null && matches.length > 0)
  +  {
  +    matches = query.match(/^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#$%'=]+( && )?[a-zA-Z0-9_+\-:.()\"*?|!{}\[\]\^~\\@#$%'=]+[ ]*)+$/); // note missing & in pattern
  +    if(matches == null)
  +    {
  +      if(alertUser) alert("Invalid search query! Queries containing the special characters && must be in the form: term1 && term2. Please try again.")
  +      return false;
  +    }
  +  }
  +  return true;
  +}
  +
  +function checkCaret(query)
  +{
  +  //matches = query.match(/^[^\^]*$|^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\~\\@#]+(\^[\d]+)?[ ]*)+$/); // note missing ^ in pattern
  +  matches = query.match(/[^\\]\^([^\s]*[^0-9.]+)|[^\\]\^$/);
  +  if(matches != null)
  +  {
  +    if(alertUser) alert("Invalid search query! The caret (^) character must be preceded by alphanumeric characters and followed by numbers. Please try again.")
  +    return false;
  +  }
  +  return true;
  +}
  +
  +function checkSquiggle(query)
  +{
  +  //matches = query.match(/^[^~]*$|^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^\\@#]+(~[\d.]+|[^\\]\\~)?[ ]*)+$/); // note missing ~ in pattern
  +  matches = query.match(/[^\\]~[^\s]*[^0-9\s]+/);
  +  if(matches != null)
  +  {
  +    if(alertUser) alert("Invalid search query! The tilde (~) character must be preceded by alphanumeric characters and followed by numbers. Please try again.")
  +    return false;
  +  }    
  +  return true;
  +}
  +
  +function checkExclamationMark(query)
  +{
  +  // NB: doesn't handle term1 ! term2 ! term3
  +  matches = query.match(/^[^!]*$|^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#$%'=]+( ! )?[a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#$%'=]+[ ]*)+$/);
  +  if(matches == null || matches.length == 0)
  +  {
  +    if(alertUser) alert("Invalid search query! Queries containing the special character ! must be in the form: term1 ! term2. Please try again.")
  +    return false;
  +  }    
  +  return true;
  +}
  +
  +function checkQuestionMark(query)
  +{
  +  matches = query.match(/^(\?)|([^a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#$%'=]\?+)/);
  +  if(matches != null && matches.length > 0)
  +  {
  +      if(alertUser) alert("Invalid search query! The question mark (?) character must be preceded by at least one alphabet or number. Please try again.")
  +    return false;
  +  }
  +  return true;
  +}
  +
  +function checkParentheses(query)
  +{
  +  var hasLeft = false;
  +  var hasRight = false;
  +  matchLeft = query.match(/[(]/g);
  +  if(matchLeft != null) hasLeft = true
  +  matchRight = query.match(/[)]/g);
  +  if(matchRight != null) hasRight = true;
  +  
  +  if(hasLeft || hasRight)
  +  {
  +    if(hasLeft && !hasRight || hasRight && !hasLeft)
  +    {
  +        if(alertUser) alert("Invalid search query! Parentheses must be closed. Please try again.")
  +        return false;
  +    }
  +    else
  +    {
  +      var number = matchLeft.length + matchRight.length;
  +      if((number % 2) > 0 || matchLeft.length != matchRight.length)
  +      {
  +        if(alertUser) alert("Invalid search query! Parentheses must be closed. Please try again.")
  +        return false;
  +      }    
  +    }
  +    matches = query.match(/\(\)/);
  +    if(matches != null)
  +    {
  +      if(alertUser) alert("Invalid search query! Parentheses must contain at least one character. Please try again.")
  +      return false;    
  +    }
  +  }  
  +  return true;    
  +}
  +
  +function checkPlusMinus(query)
  +{
  +  matches = query.match(/^[^\n+\-]*$|^([+-]?[a-zA-Z0-9_:.()\"*?&|!{}\[\]\^~\\@#$%'=]+[ ]?)+$/);
  +  if(matches == null || matches.length == 0)
  +  {
  +    if(alertUser) alert("Invalid search query! '+' and '-' modifiers must be followed by at least one alphabet or number. Please try again.")
  +    return false;
  +  }
  +  return true;
  +}
  +
  +function checkANDORNOT(query)
  +{
  +  matches = query.match(/AND|OR|NOT/);
  +  if(matches != null && matches.length > 0)
  +  {
  +    // I've no idea why the code below doesn't work since it's identical to the exclamation mark and && RE    
  +    //matches = query.match(/^([a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+(?: AND )?(?: OR )?(?: NOT )?[a-zA-Z0-9_+\-:.()\"*?&|!{}\[\]\^~\\@#]+[ ]*)+$/);
  +
  +    // we'll notify the user that this query is not validated and an error may result
  +    if(alertUser)
  +    {
  +      return confirm("Validation for queries containing AND/OR/NOT is currently not supported. If your query is not well-formed, an error may result.");
  +    }
  +    /*
  +    if(matches == null || matches.length == 0)
  +    {
  +      if(alertUser) alert("Invalid search query!  Queries containing AND/OR/NOT must be in the form: term1 AND|OR|NOT term2 Please try again.")
  +      return false;
  +    }
  +    */
  +  }
  +  return true;
  +}
  +
  +function checkQuotes(query)
  +{
  +  matches = query.match(/\"/g);
  +  if(matches != null && matches.length > 0)
  +  {
  +    var number = matches.length;
  +    if((number % 2) > 0)
  +    {
  +      if(alertUser) alert("Invalid search query! Please close all quote (\") marks.");
  +      return false;
  +    }
  +    matches = query.match(/""/);
  +    if(matches != null)
  +    {
  +      if(alertUser) alert("Invalid search query! Quotes must contain at least one character. Please try again.")
  +      return false;    
  +    }    
  +  }
  +  return true;
  +}
  +
  +function checkColon(query)
  +{
  +  matches = query.match(/[^\\\s]:[\s]|[^\\\s]:$|[\s][^\\]?:|^[^\\\s]?:/);
  +  if(matches != null)
  +  {
  +    if(alertUser) alert("Invalid search query! Field declarations (:) must be preceded by at least one alphabet or number and followed by at least one alphabet or number. Please try again.")
  +    return false;
  +  }
  +  return true;
  +}
  \ No newline at end of file
  
  
  
  1.1                  jakarta-lucene-sandbox/contributions/javascript/queryValidator/testQueryValidator.html
  
  Index: testQueryValidator.html
  ===================================================================
  <html>
  
  <head>
  <script language="JavaScript" src="f:/jsunit/app/jsUnitCore.js"></script>
  <script language="JavaScript" src="luceneQueryValidator.js"></script>
  </head>
  <body>
  <script>
  setAlertUser(false);
  
  // additions to jsUnit
  function assertTrue(comment, value)
  {
    return assertEquals(comment, true, value);
  }
  
  function assertFalse(comment, value)
  {
    return assertEquals(comment, false, value);
  }
  
  function testRemoveEscapes()
  {
    var query = "\\* foo \\haha";
    assertEquals(query, " foo aha", removeEscapes(query));
    query = "\\\\foo";
    assertEquals(query, "foo", removeEscapes(query));
    query = "foo\\\"";
    assertEquals(query, "foo", removeEscapes(query));
  }
  
  function testCheckAllowedCharacters()
  {
  fail("");
  }
  
  function testCheckAsterisk()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkAsterisk(query));
    
    query = "foo bar12* is ok*";
    assertTrue(query, checkAsterisk(query));
    
    query = "foo bar12*sdsd";
    assertTrue(query, checkAsterisk(query));
  
    query = "foo bar12*sd**sd";
    assertTrue(query, checkAsterisk(query));
  
    query = "*bar12";
    assertFalse(query, checkAsterisk(query));
  
    query = "*ba12r*";
    assertFalse(query, checkAsterisk(query));
  
    query = "bar* *bar";
    assertFalse(query, checkAsterisk(query));
  
    // test with a space in front
    query = " *bar";
    assertFalse(query, checkAsterisk(query));  
  
    // test the escaped case
    query = "bar* \\*bar";
    assertTrue(query, checkAsterisk(query));  
  
    // try including other special characters
    query = "foo:bar*ba?r";
    assertTrue(query, checkAsterisk(query));
  
    query = "foo:(ba*ba?r zoo \"zaa zoo\")";
    assertTrue(query, checkAsterisk(query));
  }
  
  function testCheckAmpersands()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkAmpersands(query));
    
    query = "foo & bar";
    assertTrue(query, checkAmpersands(query));
  
    query = "foo & bar& metoo &";
    assertTrue(query, checkAmpersands(query));
  
    query = "foo && bar12isok";
    assertTrue(query, checkAmpersands(query));
  
    query = "bar12 &&";
    assertFalse(query, checkAmpersands(query));
    
    query = "bar12 && bar12 &&";
    assertFalse(query, checkAmpersands(query));
    
    query = "bar12 && ";
    assertFalse(query, checkAmpersands(query));
   }
  
  function testCheckCaret()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkCaret(query));
    
    var query = "foo bar12isok^1.0";
    assertTrue(query, checkCaret(query));
    
    query = "\"jakarta apache\"^10";
    assertTrue(query, checkCaret(query));
  
    query = "bar12^";
    assertFalse(query, checkCaret(query));
    
    query = "bar12^10 bar12^";
    assertFalse(query, checkCaret(query));
    
    query = "bar12^ ";
    assertFalse(query, checkCaret(query));
  
    query = "bar12^ me too";
    assertFalse(query, checkCaret(query));
    
    query = "bar12^foo";
    assertFalse(query, checkCaret(query));
  
    query = "bar12^1.foo";
    assertFalse(query, checkCaret(query));
    
    // test the escaped case
    query = "\\^";
    assertTrue(query, checkCaret(query));  
  
    query = "bar\\^";
    assertTrue(query, checkCaret(query));  
  
    // try including other special characters
    query = "bar*ba?r^1.0";
    assertTrue(query, checkCaret(query));
  }
  
  function testCheckSquiggle()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkSquiggle(query));
    
    var query = "foo bar12isok~10";
    assertTrue(query, checkSquiggle(query));
    
    query = "\"jakarta apache\"~10";
    assertTrue(query, checkSquiggle(query));
  
    query = "bar12~";
    assertTrue(query, checkSquiggle(query));
    
    query = "bar12~10 bar12~";
    assertTrue(query, checkSquiggle(query));
    
    query = "bar12~ ";
    assertTrue(query, checkSquiggle(query));
  
    query = "bar12~foo";
    assertFalse(query, checkSquiggle(query));
    
    query = "bar12~1f";
    assertFalse(query, checkSquiggle(query))  
  
    // test the escaped case
    query = "\\~";
    assertTrue(query, checkSquiggle(query));  
  
    query = "bar\\~";
    assertTrue(query, checkSquiggle(query));  
  
    // try including other special characters
    query = "bar*ba?r~10";
    assertTrue(query, checkSquiggle(query));
  
    // FIXME: how about floating point proximity searches, e.g. foo~2.5
  }
  
  function testCheckExclamationMark()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkExclamationMark(query));
    
    query = "foo ! bar";
    assertTrue(query, checkExclamationMark(query));
    
    query = "\"foo\" ! \"bar\"";
    assertTrue(query, checkExclamationMark(query));
  
    query = "foo!";
    assertTrue(query, checkExclamationMark(query));
  
    query = "! bar";
    assertFalse(query, checkExclamationMark(query));
  
    query = "foo !";
    assertFalse(query, checkExclamationMark(query));
  
    query = "foo ! ";
    assertFalse(query, checkExclamationMark(query));
    
    // test escaped case
    query = "foo \\!";
    assertTrue(query, checkExclamationMark(query));
  
    query = "foo ! bar \\!";
    assertTrue(query, checkExclamationMark(query));  
    
    query = "foo ! bar ! car";
    assertTrue(query, checkExclamationMark(query));
  
    query = "foo ! bar !";
    assertFalse(query, checkExclamationMark(query));
    
    query = "foo ! bar !   ";
    assertFalse(query, checkExclamationMark(query));
  
    // try more complex queries
    query = "(foo bar) ! (car:dog*)";
    assertTrue(query, checkExclamationMark(query));
  }
  
  function testCheckQuestionMark()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkQuestionMark(query));
  
    query = "foo bar12? is ok?";
    assertTrue(query, checkQuestionMark(query));
    
    query = "foo bar12?sdsd";
    assertTrue(query, checkQuestionMark(query));
  
    query = "foo bar12?sd??sd";
    assertTrue(query, checkQuestionMark(query));
  
    query = "?bar12";
    assertFalse(query, checkQuestionMark(query));
  
    query = "?ba12r?";
    assertFalse(query, checkQuestionMark(query));
  
    query = "bar? ?bar";
    assertFalse(query, checkQuestionMark(query));
  
    // test with a space in front
    query = " ?bar";
    assertFalse(query, checkQuestionMark(query));  
  
    // test the escaped case
    query = "bar? \\?bar";
    assertTrue(query, checkQuestionMark(query));  
  
    // try including other special characters
    query = "foo:bar*ba?r";
    assertTrue(query, checkQuestionMark(query));
  
    query = "foo:(ba*ba?r zoo \"zaa zoo\")";
    assertTrue(query, checkQuestionMark(query));
  }
  
  function testCheckParentheses()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkParentheses(query));
  
    query = "(foobar12:isok)";
    assertTrue(query, checkParentheses(query));
    
    query = "(foobar12):(sdsd* me too)";
    assertTrue(query, checkParentheses(query));
  
    query = "(bar12";
    assertFalse(query, checkParentheses(query));
  
    query = "ba12r)";
    assertFalse(query, checkParentheses(query));
  
    query = "()";
    assertFalse(query, checkParentheses(query));
  
    query = "))";
    assertFalse(query, checkParentheses(query));
  
    query = "(foo bar) (bar";
    assertFalse(query, checkParentheses(query));
  
    query = "(foo bar) bar) me too";
    assertFalse(query, checkParentheses(query));
  
    // test with a space in front
    query = " (bar";
    assertFalse(query, checkParentheses(query));  
  
    // test the escaped case
    query = "foo\\)";
    assertTrue(query, doCheckLuceneQueryValue(query));  
  
    query = "foo\\) (foo bar)";
    assertTrue(query, doCheckLuceneQueryValue(query));  
  
    // try including other special characters
    query = "-(foo bar*ba?r)";
    assertTrue(query, checkParentheses(query));
  
    query = "+foo:(ba*ba?r zoo -(zaa zoo))";
    assertTrue(query, checkParentheses(query));
    
    query = "((bar12";
    assertFalse(query, checkParentheses(query));  
    
    query = "((bar12)";
    assertFalse(query, checkParentheses(query));    
  }
  
  function testCheckPlusMinus()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkPlusMinus(query));
    
    query = "+bar -foo";
    assertTrue(query, checkPlusMinus(query));   
     
    // is this allowed?
    query = "baa+foo +foo-bar";
    assertTrue(query, checkPlusMinus(query));  
  
    query = "baa+";
    assertFalse(query, checkPlusMinus(query));   
    
    query = "++baa";
    assertFalse(query, checkPlusMinus(query));   
  
    query = "+";
    assertFalse(query, checkPlusMinus(query));   
  
    query = "-";
    assertFalse(query, checkPlusMinus(query));   
    
    // test the escaped case
    query = "foo\\+";
    assertTrue(query, doCheckLuceneQueryValue(query));
    
    // try including other special characters
    query = "-(foo bar*ba?r)";
    assertTrue(query, checkParentheses(query));
  
    query = "+foo:(ba*ba?r zoo -(zaa zoo))";
    assertTrue(query, checkParentheses(query));  
  }
  
  function testCheckANDORNOT()
  {
  fail("");
  }
  
  function testCheckQuotes()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkQuotes(query));
  
    query = "\"foobar12:isok\"";
    assertTrue(query, checkQuotes(query));
    
    query = "\"(foobar12)\":(sdsd* me too)";
    assertTrue(query, checkQuotes(query));
  
    query = "\"bar12";
    assertFalse(query, checkQuotes(query));
    
    query = "\"\"";
    assertFalse(query, checkQuotes(query));  
  
    query = "ba12r\"";
    assertFalse(query, checkQuotes(query));
    
    query = "\"foo bar\" \"bar";
    assertFalse(query, checkQuotes(query));
  
    query = "\"foo bar\" bar\" me too";
    assertFalse(query, checkQuotes(query));
  
    // test with a space in front
    query = " \"bar";
    assertFalse(query, checkQuotes(query));  
  
    // test the escaped case
    query = "foo\\\"";
    assertTrue(query, doCheckLuceneQueryValue(query));  
  
    query = "foo\\\" \"foo bar\"";
    assertTrue(query, doCheckLuceneQueryValue(query));  
  
    // try including other special characters
    query = "\"foo bar*ba?r\"";
    assertTrue(query, checkQuotes(query));
  
    query = "foo:(ba*ba?r zoo \"zaa zoo\")";
    assertTrue(query, checkQuotes(query));
  
    query = "\\\"\\\"bar12\\\"";
    assertTrue(query, doCheckLuceneQueryValue(query));
  
    query = "\\\"\\\"bar12\\\"\\\"";
    assertTrue(query, doCheckLuceneQueryValue(query));
  }
  
  function testCheckColon()
  {
    var query = "foo bar is ok";
    assertTrue(query, checkColon(query));
  
    query = "foobar12:isok";
    assertTrue(query, checkColon(query));
    
    query = "(foobar12):(sdsd* me too)";
    assertTrue(query, checkColon(query));
  
    query = "bar12:";
    assertFalse(query, checkColon(query));
  
    query = ":ba12r";
    assertFalse(query, checkColon(query));
  
    query = "foo:bar :bar";
    assertFalse(query, checkColon(query));
  
    query = "foo:bar bar: me too";
    assertFalse(query, checkColon(query));
  
    // test with a space in front
    query = " :bar";
    assertFalse(query, checkColon(query));  
  
    // test the escaped case
    query = "foo\\:";
    assertTrue(query, checkColon(query));  
  
    query = "foo\\: foo:bar";
    assertTrue(query, checkColon(query));  
  
    // try including other special characters
    query = "foo:bar*ba?r";
    assertTrue(query, checkColon(query));
  
    query = "foo:(ba*ba?r zoo \"zaa zoo\")";
    assertTrue(query, checkColon(query));
  }
  </script>
  </body>
  </html>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-dev-help@jakarta.apache.org