diff --git a/querydsl-lucene/pom.xml b/querydsl-lucene/pom.xml
index 2f5117116..572859c75 100644
--- a/querydsl-lucene/pom.xml
+++ b/querydsl-lucene/pom.xml
@@ -51,7 +51,42 @@
commons-io
1.3.2
test
+
+
+
+ joda-time
+ joda-time
+ 1.6
+ test
+
+
+
+ com.mysema.querydsl
+ querydsl-apt
+ ${version}
-
+
+
+
+
+ com.mysema.maven
+ maven-apt-plugin
+ 1.0.1
+
+
+
+ test-process
+
+
+ target/generated-test-sources/java
+ com.mysema.query.apt.QuerydslAnnotationProcessor
+ false
+ true
+
+
+
+
+
+
diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java
index c50efc61a..86f8ad007 100644
--- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java
+++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/LuceneSerializer.java
@@ -16,6 +16,8 @@ import java.util.Map;
import javax.annotation.Nullable;
+import net.jcip.annotations.ThreadSafe;
+
import org.apache.commons.lang.StringUtils;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
@@ -41,7 +43,6 @@ import com.mysema.query.types.PathType;
*
*/
public class LuceneSerializer {
-
private static final Map, Integer> sortFields = new HashMap, Integer>();
static {
@@ -149,10 +150,10 @@ public class LuceneSerializer {
protected Query eq(Operation> operation, QueryMetadata metadata) {
verifyArguments(operation);
String field = toField(operation.getArg(0));
-
+
//TODO Implement this
//boolean tokenized = isTokenized(operation.getArg(0));
-
+
if (Number.class.isAssignableFrom(operation.getArg(1).getType())) {
return new TermQuery(new Term(field, convertNumber(((Constant) operation
.getArg(1)).getConstant())));
@@ -200,7 +201,7 @@ public class LuceneSerializer {
Collection values = (Collection) ((Constant) operation.getArg(1)).getConstant();
BooleanQuery bq = new BooleanQuery();
for (Object value : values) {
- bq.add(eq(field, StringUtils.split(value.toString()), metadata), Occur.SHOULD);
+ bq.add(eq(field, splitTerms ? StringUtils.split(value.toString()) : new String[] { value.toString() }, metadata), Occur.SHOULD);
}
return bq;
}
@@ -336,14 +337,14 @@ public class LuceneSerializer {
}
protected String toField(Path> path) {
- String rv = path.getMetadata().getExpression().toString();
+ String rv = path.getMetadata().getExpression().toString();
if (path.getMetadata().getParent() != null){
Path> parent = path.getMetadata().getParent();
if (parent.getMetadata().getPathType() != PathType.VARIABLE){
rv = toField(parent) + "." + rv;
}
}
- return rv;
+ return rv;
}
private void verifyArguments(Operation> operation) {
diff --git a/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerNotTokenizedTest.java b/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerNotTokenizedTest.java
new file mode 100644
index 000000000..339961c8e
--- /dev/null
+++ b/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerNotTokenizedTest.java
@@ -0,0 +1,137 @@
+package com.mysema.query;
+import static com.mysema.query.QPerson.person;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Field.Index;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriter.MaxFieldLength;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Searcher;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.Version;
+import org.joda.time.LocalDate;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.mysema.query.lucene.LuceneSerializer;
+import com.mysema.query.types.Expression;
+
+public class LuceneSerializerNotTokenizedTest {
+ private RAMDirectory idx;
+ private IndexWriter writer;
+ private Searcher searcher;
+ private LuceneSerializer serializer;
+
+ private final QueryMetadata metadata = new DefaultQueryMetadata();
+
+ private final Person clooney = new Person("actor_1", "George Clooney", new LocalDate(1961, 4, 6));
+ private final Person pitt = new Person("actor_2", "Brad Pitt", new LocalDate(1963, 12, 18));
+
+ private void testQuery(Expression> expr, String expectedQuery, int expectedHits) throws Exception {
+ Query query = serializer.toQuery(expr, metadata);
+ TopDocs docs = searcher.search(query, 100);
+ assertEquals(expectedHits, docs.totalHits);
+ assertEquals(expectedQuery, query.toString());
+ }
+
+ private Document createDocument(Person person) {
+ Document doc = new Document();
+ doc.add(new Field("id", person.getId(), Store.YES, Index.NOT_ANALYZED));
+ doc.add(new Field("name", person.getName(), Store.YES, Index.NOT_ANALYZED));
+ doc.add(new Field("birthDate", person.getBirthDate().toString(), Store.YES, Index.NOT_ANALYZED));
+ return doc;
+ }
+
+ @Before
+ public void Before() throws Exception {
+ serializer = new LuceneSerializer(false, false);
+ idx = new RAMDirectory();
+ writer = new IndexWriter(idx, new StandardAnalyzer(Version.LUCENE_CURRENT), true, MaxFieldLength.UNLIMITED);
+
+ writer.addDocument(createDocument(clooney));
+ writer.addDocument(createDocument(pitt));
+
+ writer.optimize();
+ writer.close();
+
+ searcher = new IndexSearcher(idx);
+ }
+
+ @Test
+ public void Equals_By_Id_Matches() throws Exception {
+ testQuery(person.id.eq("actor_1"), "id:actor_1", 1);
+ }
+
+ @Test
+ public void Equals_By_Id_Does_Not_Match() throws Exception {
+ testQuery(person.id.eq("actor_8"), "id:actor_8", 0);
+ }
+
+ @Test
+ public void Equals_By_Name_Matches() throws Exception {
+ testQuery(person.name.eq("George Clooney"), "name:George Clooney", 1);
+ }
+
+ @Test
+ public void Equals_By_Name_Ignoring_Case_Does_Not_Match() throws Exception {
+ testQuery(person.name.equalsIgnoreCase("george clooney"), "name:george clooney", 0);
+ }
+
+ @Test
+ public void Equals_By_Name_Does_Not_Match() throws Exception {
+ testQuery(person.name.eq("George Looney"), "name:George Looney", 0);
+ }
+
+ @Test
+ public void Starts_With_Name_Should_Match() throws Exception {
+ testQuery(person.name.startsWith("George C"), "name:George C*", 1);
+ }
+
+ @Test
+ public void Starts_With_Name_Should_Not_Match() throws Exception {
+ testQuery(person.name.startsWith("George L"), "name:George L*", 0);
+ }
+
+ @Test
+ public void Ends_With_Name_Should_Match() throws Exception {
+ testQuery(person.name.endsWith("e Clooney"), "name:*e Clooney", 1);
+ }
+
+ @Test
+ public void Ends_With_Name_Should_Not_Match() throws Exception {
+ testQuery(person.name.endsWith("e Looney"), "name:*e Looney", 0);
+ }
+
+ @Test
+ public void Contains_Name_Should_Match() throws Exception {
+ testQuery(person.name.contains("oney"), "name:*oney*", 1);
+ }
+
+ @Test
+ public void Contains_Name_Should_Not_Match() throws Exception {
+ testQuery(person.name.contains("bloney"), "name:*bloney*", 0);
+ }
+
+ @Test
+ public void In_Names_Should_Match_2() throws Exception {
+ testQuery(person.name.in("Brad Pitt", "George Clooney"), "name:Brad Pitt name:George Clooney", 2);
+ }
+
+ @Test
+ public void Or_By_Name_Should_Match_2() throws Exception {
+ testQuery(person.name.eq("Brad Pitt").or(person.name.eq("George Clooney")), "name:Brad Pitt name:George Clooney", 2);
+ }
+
+ @Test
+ public void Equals_By_Birth_Date() throws Exception {
+ testQuery(person.birthDate.eq(clooney.getBirthDate()), "birthDate:1961-04-06", 1);
+ }
+}
diff --git a/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerTest.java b/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerTest.java
index b18b687c5..fbf2371e2 100644
--- a/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerTest.java
+++ b/querydsl-lucene/src/test/java/com/mysema/query/LuceneSerializerTest.java
@@ -97,7 +97,6 @@ public class LuceneSerializerTest {
@Before
public void setUp() throws Exception {
- // TODO Tests for non lower case
serializer = new LuceneSerializer(true,true);
entityPath = new PathBuilder