Repository: olingo-odata4 Updated Branches: refs/heads/OLINGO-568_SearchParserPoC 40962a9a1 -> d38d0620c
[OLINGO-568] second parser draft Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/d38d0620 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/d38d0620 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/d38d0620 Branch: refs/heads/OLINGO-568_SearchParserPoC Commit: d38d0620c7447454b53bfae252fe3129b7ea0632 Parents: 40962a9 Author: Christian Amend <[email protected]> Authored: Thu Nov 12 16:32:43 2015 +0100 Committer: Christian Amend <[email protected]> Committed: Fri Nov 13 07:55:42 2015 +0100 ---------------------------------------------------------------------- .../api/uri/queryoption/search/SearchUnary.java | 6 +- .../uri/parser/search/SearchBinaryImpl.java | 14 +- .../core/uri/parser/search/SearchParser.java | 192 ++++++++++--------- .../parser/search/SearchParserException.java | 31 +++ .../core/uri/parser/search/SearchTokenizer.java | 5 +- .../parser/search/SearchTokenizerException.java | 7 +- .../core/uri/parser/search/SearchUnaryImpl.java | 18 +- .../search/SearchParserAndTokenizerTest.java | 25 +-- .../uri/parser/search/SearchParserTest.java | 111 ++++++----- 9 files changed, 235 insertions(+), 174 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/search/SearchUnary.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/search/SearchUnary.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/search/SearchUnary.java index c266308..b01094d 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/search/SearchUnary.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/search/SearchUnary.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -21,6 +21,6 @@ package org.apache.olingo.server.api.uri.queryoption.search; public interface SearchUnary extends SearchExpression { SearchUnaryOperatorKind getOperator(); - SearchTerm getOperand(); + SearchExpression getOperand(); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchBinaryImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchBinaryImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchBinaryImpl.java index 418d9e7..ed0a697 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchBinaryImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchBinaryImpl.java @@ -25,12 +25,18 @@ import org.apache.olingo.server.api.uri.queryoption.search.SearchExpression; public class SearchBinaryImpl extends SearchExpressionImpl implements SearchBinary { private final SearchBinaryOperatorKind operator; - private final SearchExpression left; - private final SearchExpression right; + private SearchExpression left; + private SearchExpression right; - public SearchBinaryImpl(SearchExpression left, SearchBinaryOperatorKind operator, SearchExpression right) { - this.left = left; + public SearchBinaryImpl(SearchBinaryOperatorKind operator) { this.operator = operator; + } + + public void setLeft(SearchExpression left) { + this.left = left; + } + + public void setRight(SearchExpression right) { this.right = right; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java index 25c52f2..a5d9a3f 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,126 +18,140 @@ */ package org.apache.olingo.server.core.uri.parser.search; +import java.util.ArrayList; + import org.apache.olingo.server.api.uri.queryoption.SearchOption; import org.apache.olingo.server.api.uri.queryoption.search.SearchBinaryOperatorKind; import org.apache.olingo.server.api.uri.queryoption.search.SearchExpression; import org.apache.olingo.server.core.uri.queryoption.SearchOptionImpl; -import java.util.Iterator; -import java.util.List; - public class SearchParser { - private Iterator<SearchQueryToken> tokens; - private SearchExpression root; - private SearchQueryToken token; + protected ArrayList<SearchQueryToken> tokens; + private int size; + private int currentPosition = -1; - public SearchOption parse(String path, String value) { + public SearchOption parse(String path, String value) throws SearchTokenizerException, SearchParserException { SearchTokenizer tokenizer = new SearchTokenizer(); - try { - tokens = tokenizer.tokenize(value).iterator(); - nextToken(); - root = processSearchExpression(null); - } catch (SearchTokenizerException e) { - return null; - } + tokens = tokenizer.tokenize(value); + SearchExpression root = processTokens(); final SearchOptionImpl searchOption = new SearchOptionImpl(); searchOption.setSearchExpression(root); return searchOption; } - protected SearchExpression parseInternal(List<SearchQueryToken> tokens) { - this.tokens = tokens.iterator(); - nextToken(); - return processSearchExpression(null); - } - - private SearchExpression processSearchExpression(SearchExpression left) { - if(token == null) { - return left; + protected SearchExpression processTokens() throws SearchParserException { + size = tokens.size(); + SearchExpression root = null; + SearchQueryToken nextToken = next(); + switch (nextToken.getToken()) { + case WORD: + case PHRASE: + root = processWord(null, nextToken.getLiteral()); + break; + case NOT: + root = processNot(); + case OPEN: + // TODO: implement + default: + break; } - if(token.getToken() == SearchQueryToken.Token.OPEN) { - processOpen(); - throw illegalState(); - } else if(token.getToken() == SearchQueryToken.Token.CLOSE) { - processClose(); - throw illegalState(); - } else if(token.getToken() == SearchQueryToken.Token.NOT) { - processNot(); - } else if(token.getToken() == SearchQueryToken.Token.PHRASE || - token.getToken() == SearchQueryToken.Token.WORD) { - return processSearchExpression(processTerm()); - } else if(token.getToken() == SearchQueryToken.Token.AND) { - SearchExpression se = processAnd(left); - return processSearchExpression(se); - } else if(token.getToken() == SearchQueryToken.Token.OR) { - return processOr(left); - } else { - throw illegalState(); + if (hasNext()) { + throw new SearchParserException(); } - throw illegalState(); - } - private void processClose() { - nextToken(); + return root; } - private void processOpen() { - nextToken(); + private SearchExpression processNot() throws SearchParserException { + SearchUnaryImpl not = new SearchUnaryImpl(); + SearchQueryToken nextToken = next(); + switch (nextToken.getToken()) { + case WORD: + case PHRASE: + processWord(not, nextToken.getLiteral()); + case OPEN: + default: + break; + } + return not; } - private SearchExpression processAnd(SearchExpression left) { - nextToken(); - SearchExpression se = processTerm(); - return new SearchBinaryImpl(left, SearchBinaryOperatorKind.AND, se); + private SearchExpression processWord(SearchUnaryImpl not, String literal) throws SearchParserException { + SearchExpression exp = new SearchTermImpl(literal); + if (not != null) { + not.setOperand(exp); + exp = not; + } + if (hasNext()) { + SearchQueryToken nextToken = next(); + switch (nextToken.getToken()) { + case WORD: + case PHRASE: + exp = processImplicitAnd(exp, nextToken); + break; + case AND: + exp = processAnd(exp); + break; + case OR: + exp = processOr(exp); + break; + default: + break; + } + } + return exp; } - public SearchExpression processOr(SearchExpression left) { - nextToken(); - SearchExpression se = processSearchExpression(left); - return new SearchBinaryImpl(left, SearchBinaryOperatorKind.OR, se); + private SearchExpression processOr(SearchExpression left) throws SearchParserException { + SearchBinaryImpl or = new SearchBinaryImpl(SearchBinaryOperatorKind.OR); + or.setLeft(left); + SearchQueryToken nextToken = next(); + switch (nextToken.getToken()) { + case WORD: + case PHRASE: + or.setRight(processWord(null, nextToken.getLiteral())); + break; + default: + break; + } + return or; } - private RuntimeException illegalState() { - return new RuntimeException(); + private SearchExpression processAnd(SearchExpression left) throws SearchParserException { + SearchBinaryImpl and = new SearchBinaryImpl(SearchBinaryOperatorKind.AND); + and.setLeft(left); + SearchQueryToken nextToken = next(); + switch (nextToken.getToken()) { + case WORD: + case PHRASE: + and.setRight(processWord(null, nextToken.getLiteral())); + break; + default: + break; + } + return and; } - private void processNot() { - nextToken(); + private SearchExpression processImplicitAnd(SearchExpression left, SearchQueryToken nextToken) + throws SearchParserException { + SearchBinaryImpl and = new SearchBinaryImpl(SearchBinaryOperatorKind.AND); + and.setLeft(left); + and.setRight(new SearchTermImpl(nextToken.getLiteral())); + return and; } - private void nextToken() { - if(tokens.hasNext()) { - token = tokens.next(); + private SearchQueryToken next() throws SearchParserException { + currentPosition++; + if (currentPosition < size) { + return tokens.get(currentPosition); } else { - token = null; - } -// return null; - } - - private SearchExpression processTerm() { - if(token.getToken() == SearchQueryToken.Token.NOT) { - return new SearchUnaryImpl(processPhrase()); + throw new SearchParserException(); } - if(token.getToken() == SearchQueryToken.Token.PHRASE) { - return processPhrase(); - } - if(token.getToken() == SearchQueryToken.Token.WORD) { - return processWord(); - } - return null; - } - - private SearchTermImpl processWord() { - String literal = token.getLiteral(); - nextToken(); - return new SearchTermImpl(literal); } - private SearchTermImpl processPhrase() { - String literal = token.getLiteral(); - nextToken(); - return new SearchTermImpl(literal); + private boolean hasNext() { + return currentPosition + 1 < size; } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParserException.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParserException.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParserException.java new file mode 100644 index 0000000..be22620 --- /dev/null +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParserException.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.olingo.server.core.uri.parser.search; + +import org.apache.olingo.server.core.uri.parser.UriParserSemanticException; + +public class SearchParserException extends UriParserSemanticException { + private static final long serialVersionUID = 5781553037561337795L; + + //TODO: message keys + public SearchParserException() { + super(null, null); + } + +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java index a9a5895..6587ef3 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java @@ -19,7 +19,6 @@ package org.apache.olingo.server.core.uri.parser.search; import java.util.ArrayList; -import java.util.List; /** * <code> @@ -440,13 +439,13 @@ public class SearchTokenizer { * @throws SearchTokenizerException if something in query is not valid * (based on OData search query ABNF) */ - public List<SearchQueryToken> tokenize(final String searchQuery) + public ArrayList<SearchQueryToken> tokenize(final String searchQuery) throws SearchTokenizerException { char[] chars = searchQuery.trim().toCharArray(); State state = new SearchExpressionState(); - List<SearchQueryToken> states = new ArrayList<SearchQueryToken>(); + ArrayList<SearchQueryToken> states = new ArrayList<SearchQueryToken>(); for (char aChar : chars) { State next = state.nextChar(aChar); if (state.isFinished()) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerException.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerException.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerException.java index 451632b..6abf6cc 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerException.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerException.java @@ -18,11 +18,14 @@ */ package org.apache.olingo.server.core.uri.parser.search; -public class SearchTokenizerException extends Exception { +import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException; + +public class SearchTokenizerException extends UriParserSyntaxException { private static final long serialVersionUID = -8295456415309640166L; + //TODO: Translation texts public SearchTokenizerException(String message) { - super(message); + super(message, null); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchUnaryImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchUnaryImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchUnaryImpl.java index 51e3a24..f82d478 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchUnaryImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchUnaryImpl.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,24 +18,24 @@ */ package org.apache.olingo.server.core.uri.parser.search; -import org.apache.olingo.server.api.uri.queryoption.search.SearchTerm; +import org.apache.olingo.server.api.uri.queryoption.search.SearchExpression; import org.apache.olingo.server.api.uri.queryoption.search.SearchUnary; import org.apache.olingo.server.api.uri.queryoption.search.SearchUnaryOperatorKind; public class SearchUnaryImpl extends SearchExpressionImpl implements SearchUnary { - private final SearchTerm operand; - - public SearchUnaryImpl(SearchTerm operand) { - this.operand = operand; - } + private SearchExpression operand; @Override public SearchUnaryOperatorKind getOperator() { return SearchUnaryOperatorKind.NOT; } + public void setOperand(SearchExpression operand) { + this.operand = operand; + } + @Override - public SearchTerm getOperand() { + public SearchExpression getOperand() { return operand; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java index 3ecd517..f68b81c 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java @@ -33,10 +33,7 @@ import org.junit.Test; public class SearchParserAndTokenizerTest { @Test - public void basicParsing() throws SearchTokenizerException { -// SearchExpressionValidator.init("a AND b OR c").enableLogging() -// .validate(with("a")); - + public void basicParsing() throws Exception { SearchExpressionValidator.init("a") .validate(with("a")); SearchExpressionValidator.init("a AND b") @@ -95,11 +92,15 @@ public class SearchParserAndTokenizerTest { } private static SearchExpression or(SearchExpression right) { - return new SearchBinaryImpl(null, OR, right); + SearchBinaryImpl impl = new SearchBinaryImpl(OR); + impl.setRight(right); + return impl; } private static SearchExpression and(SearchExpression right) { - return new SearchBinaryImpl(null, AND, right); + SearchBinaryImpl impl = new SearchBinaryImpl(AND); + impl.setRight(right); + return impl; } private static SearchExpression and(String right) { @@ -111,7 +112,9 @@ public class SearchParserAndTokenizerTest { } private static SearchUnary not(String term) { - return new SearchUnaryImpl(new SearchTermImpl(term)); + SearchUnaryImpl unary = new SearchUnaryImpl(); + unary.setOperand(new SearchTermImpl(term)); + return unary; } private static void setLeftField(String left, SearchExpression se) { @@ -159,17 +162,18 @@ public class SearchParserAndTokenizerTest { Assert.fail("Expected exception " + exception.getClass().getSimpleName() + " was not thrown."); } - private void validate(SearchExpression expectedSearchExpression) throws SearchTokenizerException { + private void validate(SearchExpression expectedSearchExpression) throws SearchTokenizerException, + SearchParserException { final SearchExpression searchExpression = getSearchExpression(); Assert.assertEquals(expectedSearchExpression.toString(), searchExpression.toString()); } - private void validate(String expectedSearchExpression) throws SearchTokenizerException { + private void validate(String expectedSearchExpression) throws SearchTokenizerException, SearchParserException { final SearchExpression searchExpression = getSearchExpression(); Assert.assertEquals(expectedSearchExpression, searchExpression.toString()); } - private SearchExpression getSearchExpression() { + private SearchExpression getSearchExpression() throws SearchTokenizerException, SearchParserException { SearchParser tokenizer = new SearchParser(); SearchOption result = tokenizer.parse(null, searchQuery); Assert.assertNotNull(result); @@ -182,5 +186,4 @@ public class SearchParserAndTokenizerTest { } } - } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d38d0620/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java index ce37f3d..383c0d1 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; -import java.util.List; import org.apache.olingo.server.api.uri.queryoption.search.SearchBinaryOperatorKind; import org.apache.olingo.server.api.uri.queryoption.search.SearchExpression; @@ -33,31 +32,31 @@ import org.apache.olingo.server.core.uri.parser.search.SearchQueryToken.Token; import org.junit.Ignore; import org.junit.Test; -public class SearchParserTest extends SearchParser { +public class SearchParserTest { @Test - public void simple() { + public void simple() throws Exception { SearchExpression se = run(Token.WORD); assertEquals("'word1'", se.toString()); assertTrue(se.isSearchTerm()); assertEquals("word1", se.asSearchTerm().getSearchTerm()); - + se = run(Token.PHRASE); assertEquals("'phrase1'", se.toString()); assertTrue(se.isSearchTerm()); - //TODO: Check if quotation marks should be part of the string we deliver + // TODO: Check if quotation marks should be part of the string we deliver assertEquals("phrase1", se.asSearchTerm().getSearchTerm()); } @Test - public void simpleAnd() { + public void simpleAnd() throws Exception { SearchExpression se = run(Token.WORD, Token.AND, Token.WORD); assertEquals("{'word1' AND 'word2'}", se.toString()); assertTrue(se.isSearchBinary()); assertEquals(SearchBinaryOperatorKind.AND, se.asSearchBinary().getOperator()); assertEquals("word1", se.asSearchBinary().getLeftOperand().asSearchTerm().getSearchTerm()); assertEquals("word2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm()); - + se = run(Token.PHRASE, Token.AND, Token.PHRASE); assertEquals("{'phrase1' AND 'phrase2'}", se.toString()); assertTrue(se.isSearchBinary()); @@ -65,16 +64,16 @@ public class SearchParserTest extends SearchParser { assertEquals("phrase1", se.asSearchBinary().getLeftOperand().asSearchTerm().getSearchTerm()); assertEquals("phrase2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm()); } - + @Test - public void simpleOr() { + public void simpleOr() throws Exception { SearchExpression se = run(Token.WORD, Token.OR, Token.WORD); assertEquals("{'word1' OR 'word2'}", se.toString()); assertTrue(se.isSearchBinary()); assertEquals(SearchBinaryOperatorKind.OR, se.asSearchBinary().getOperator()); assertEquals("word1", se.asSearchBinary().getLeftOperand().asSearchTerm().getSearchTerm()); assertEquals("word2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm()); - + se = run(Token.PHRASE, Token.OR, Token.PHRASE); assertEquals("{'phrase1' OR 'phrase2'}", se.toString()); assertTrue(se.isSearchBinary()); @@ -82,17 +81,16 @@ public class SearchParserTest extends SearchParser { assertEquals("phrase1", se.asSearchBinary().getLeftOperand().asSearchTerm().getSearchTerm()); assertEquals("phrase2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm()); } - - @Ignore + @Test - public void simpleImplicitAnd() { + public void simpleImplicitAnd() throws Exception { SearchExpression se = run(Token.WORD, Token.WORD); assertEquals("{'word1' AND 'word2'}", se.toString()); assertTrue(se.isSearchBinary()); assertEquals(SearchBinaryOperatorKind.AND, se.asSearchBinary().getOperator()); assertEquals("word1", se.asSearchBinary().getLeftOperand().asSearchTerm().getSearchTerm()); assertEquals("word2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm()); - + se = run(Token.PHRASE, Token.PHRASE); assertEquals("{'phrase1' AND 'phrase2'}", se.toString()); assertTrue(se.isSearchBinary()); @@ -100,86 +98,93 @@ public class SearchParserTest extends SearchParser { assertEquals("phrase1", se.asSearchBinary().getLeftOperand().asSearchTerm().getSearchTerm()); assertEquals("phrase2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm()); } - + @Ignore @Test - public void simpleBrackets() { + public void simpleBrackets() throws Exception { SearchExpression se = run(Token.OPEN, Token.WORD, Token.CLOSE); assertEquals("'word1'", se.toString()); assertTrue(se.isSearchTerm()); assertEquals("word1", se.asSearchTerm().getSearchTerm()); - + se = run(Token.OPEN, Token.PHRASE, Token.CLOSE); assertEquals("'phrase1'", se.toString()); assertTrue(se.isSearchTerm()); assertEquals("phrase1", se.asSearchTerm().getSearchTerm()); } - - @Ignore + @Test - public void simpleNot() { + public void simpleNot() throws Exception { SearchExpression se = run(Token.NOT, Token.WORD); assertEquals("{NOT 'word1'}", se.toString()); assertTrue(se.isSearchUnary()); assertEquals("word1", se.asSearchUnary().getOperand().asSearchTerm().getSearchTerm()); - - se = run(Token.NOT, Token.WORD); - assertEquals("'phrase1'", se.toString()); + + se = run(Token.NOT, Token.PHRASE); + assertEquals("{NOT 'phrase1'}", se.toString()); assertTrue(se.isSearchUnary()); assertEquals("phrase1", se.asSearchUnary().getOperand().asSearchTerm().getSearchTerm()); } - + @Ignore @Test - public void precedenceLast() { - //word1 AND (word2 AND word3) + public void precedenceLast() throws Exception { + // word1 AND (word2 AND word3) SearchExpression se = run(Token.WORD, Token.AND, Token.OPEN, Token.WORD, Token.AND, Token.WORD, Token.CLOSE); assertEquals("{'word1' AND {'word2' AND 'word3'}}", se.toString()); } - + @Ignore @Test - public void precedenceFirst() { - //(word1 AND word2) AND word3 + public void precedenceFirst() throws Exception { + // (word1 AND word2) AND word3 SearchExpression se = run(Token.OPEN, Token.WORD, Token.AND, Token.WORD, Token.CLOSE, Token.AND, Token.WORD); assertEquals("{{'word1' AND 'word2'} AND 'word3'}", se.toString()); } + @Ignore @Test - public void combinationAndOr() { - //word1 AND word2 OR word3 - SearchExpression se = run(Token.WORD, Token.AND, Token.WORD, Token.OR, Token.WORD); + public void baseCases() throws Exception { + // word1 AND (word2 OR word3) + SearchExpression se = run(Token.WORD, Token.AND, Token.OPEN, Token.WORD, Token.OR, Token.WORD, Token.CLOSE); + assertEquals("{'word1' AND {'word2' OR 'word3'}}", se.toString()); + + // word1 AND word2 OR word3 + se = run(Token.WORD, Token.AND, Token.WORD, Token.OR, Token.WORD); assertEquals("{{'word1' AND 'word2'} OR 'word3'}", se.toString()); - //word1 OR word2 AND word3 + + // word1 OR word2 AND word3 se = run(Token.WORD, Token.OR, Token.WORD, Token.AND, Token.WORD); assertEquals("{'word1' OR {'word2' AND 'word3'}}", se.toString()); } - - private SearchExpression run(SearchQueryToken.Token... tokenArray) { - List<SearchQueryToken> tokenList = prepareTokens(tokenArray); - SearchExpression se = parseInternal(tokenList); + private SearchExpression run(SearchQueryToken.Token... tokenArray) throws SearchParserException { + LocalTestParser parser = new LocalTestParser(); + parser.prepareTokens(tokenArray); + SearchExpression se = parser.processTokens(); assertNotNull(se); return se; } - public List<SearchQueryToken> prepareTokens(SearchQueryToken.Token... tokenArray) { - ArrayList<SearchQueryToken> tokenList = new ArrayList<SearchQueryToken>(); - int wordNumber = 1; - int phraseNumber = 1; - for (int i = 0; i < tokenArray.length; i++) { - SearchQueryToken token = mock(SearchQueryToken.class); - when(token.getToken()).thenReturn(tokenArray[i]); - if (tokenArray[i] == Token.WORD) { - when(token.getLiteral()).thenReturn("word" + wordNumber); - wordNumber++; - } else if (tokenArray[i] == Token.PHRASE) { - when(token.getLiteral()).thenReturn("phrase" + phraseNumber); - phraseNumber++; + private class LocalTestParser extends SearchParser { + + public void prepareTokens(SearchQueryToken.Token... tokenArray) { + ArrayList<SearchQueryToken> tokenList = new ArrayList<SearchQueryToken>(); + int wordNumber = 1; + int phraseNumber = 1; + for (int i = 0; i < tokenArray.length; i++) { + SearchQueryToken token = mock(SearchQueryToken.class); + when(token.getToken()).thenReturn(tokenArray[i]); + if (tokenArray[i] == Token.WORD) { + when(token.getLiteral()).thenReturn("word" + wordNumber); + wordNumber++; + } else if (tokenArray[i] == Token.PHRASE) { + when(token.getLiteral()).thenReturn("phrase" + phraseNumber); + phraseNumber++; + } + tokenList.add(token); } - tokenList.add(token); + tokens = tokenList; } - return tokenList; } - } \ No newline at end of file
