[hibernate-commits] Hibernate SVN: r18812 - in search/trunk/src: test/java/org/hibernate/search/test/bridge and 1 other directory.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Tue Feb 16 14:24:47 EST 2010
Author: epbernard
Date: 2010-02-16 14:24:46 -0500 (Tue, 16 Feb 2010)
New Revision: 18812
Added:
search/trunk/src/test/java/org/hibernate/search/test/bridge/ClassBridgeAndProjectionTest.java
search/trunk/src/test/java/org/hibernate/search/test/bridge/Student.java
search/trunk/src/test/java/org/hibernate/search/test/bridge/StudentsSizeBridge.java
search/trunk/src/test/java/org/hibernate/search/test/bridge/Teacher.java
Modified:
search/trunk/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
Log:
HSEARCH-372 support for projection of the ClassBridges (assuming the name is provided explicitly)
Modified: search/trunk/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
===================================================================
--- search/trunk/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-02-16 17:44:06 UTC (rev 18811)
+++ search/trunk/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-02-16 19:24:46 UTC (rev 18812)
@@ -673,6 +673,7 @@
}
private static void processFieldsForProjection(PropertiesMetadata metadata, String[] fields, Object[] result, Document document) {
+ //process base fields
final int nbrFoEntityFields = metadata.fieldNames.size();
for ( int index = 0; index < nbrFoEntityFields; index++ ) {
populateResult(
@@ -684,6 +685,8 @@
document
);
}
+
+ //process fields of embedded
final int nbrOfEmbeddedObjects = metadata.embeddedPropertiesMetadata.size();
for ( int index = 0; index < nbrOfEmbeddedObjects; index++ ) {
//there is nothing we can do for collections
@@ -693,6 +696,19 @@
);
}
}
+
+ //process class bridges
+ final int nbrOfClassBridges = metadata.classBridges.size();
+ for ( int index = 0; index < nbrOfClassBridges; index++ ) {
+ populateResult(
+ metadata.classNames.get(index),
+ metadata.classBridges.get(index),
+ metadata.classStores.get(index),
+ fields,
+ result,
+ document
+ );
+ }
}
private static int getFieldPosition(String[] fields, String fieldName) {
@@ -721,5 +737,11 @@
return;
}
}
+ for ( FieldBridge bridge : metadata.classBridges ) {
+ if ( !( bridge instanceof TwoWayStringBridge || bridge instanceof TwoWayString2FieldBridgeAdaptor ) ) {
+ allowFieldSelectionInProjection = false;
+ return;
+ }
+ }
}
}
Added: search/trunk/src/test/java/org/hibernate/search/test/bridge/ClassBridgeAndProjectionTest.java
===================================================================
--- search/trunk/src/test/java/org/hibernate/search/test/bridge/ClassBridgeAndProjectionTest.java (rev 0)
+++ search/trunk/src/test/java/org/hibernate/search/test/bridge/ClassBridgeAndProjectionTest.java 2010-02-16 19:24:46 UTC (rev 18812)
@@ -0,0 +1,76 @@
+package org.hibernate.search.test.bridge;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.util.Version;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.search.FullTextQuery;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.search.test.SearchTestCase;
+
+import java.util.List;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ClassBridgeAndProjectionTest extends SearchTestCase {
+
+ public void testClassBridgeProjection() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+
+ // create entities
+ Teacher teacher = new Teacher();
+ teacher.setName("John Smith");
+ s.persist(teacher);
+
+ Student student1 = new Student();
+ student1.setGrade("foo");
+ student1.setName("Jack Miller");
+ student1.setTeacher(teacher);
+ teacher.getStudents().add(student1);
+ s.persist(student1);
+
+ Student student2 = new Student();
+ student2.setGrade("bar");
+ student2.setName("Steve Marshall");
+ student2.setTeacher(teacher);
+ teacher.getStudents().add(student2);
+ s.persist(student2);
+
+ tx.commit();
+
+ // test query without projection
+ FullTextSession ftSession = Search.getFullTextSession( s );
+ QueryParser parser = new QueryParser(
+ Version.LUCENE_CURRENT,
+ "name",
+ new StandardAnalyzer(Version.LUCENE_CURRENT) );
+ FullTextQuery query = ftSession.createFullTextQuery(parser.parse("name:John"), Teacher.class);
+ List results = query.list();
+ assertNotNull(results);
+ assertTrue(results.size() == 1);
+ assertTrue(((Teacher) results.get(0)).getStudents().size() == 2);
+
+ // now test with projection
+ query.setProjection("amount_of_students");
+ results = query.list();
+ assertNotNull(results);
+ assertTrue(results.size() == 1);
+ Object[] firstResult = (Object[]) results.get(0);
+ Integer amountStudents = (Integer) firstResult[0];
+ assertEquals(new Integer(2), amountStudents);
+
+ s.close();
+ }
+
+ @Override
+ protected Class<?>[] getMappings() {
+ return new Class<?>[] {
+ Student.class,
+ Teacher.class
+ };
+ }
+}
Added: search/trunk/src/test/java/org/hibernate/search/test/bridge/Student.java
===================================================================
--- search/trunk/src/test/java/org/hibernate/search/test/bridge/Student.java (rev 0)
+++ search/trunk/src/test/java/org/hibernate/search/test/bridge/Student.java 2010-02-16 19:24:46 UTC (rev 18812)
@@ -0,0 +1,67 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
+
+import javax.persistence.*;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+ at Table(name = "student")
+public class Student {
+
+
+ private Long id;
+ private String name;
+ private String grade;
+ private Teacher teacher;
+
+
+ @Id
+ @GeneratedValue
+ @Column(name = "student_id")
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Column(name = "name")
+ @Field(index = Index.TOKENIZED, store = Store.YES)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Column(name = "grade")
+ @Field(index = Index.UN_TOKENIZED, store = Store.YES)
+ public String getGrade() {
+ return grade;
+ }
+
+ public void setGrade(String grade) {
+ this.grade = grade;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "teacher_id")
+ public Teacher getTeacher() {
+ return teacher;
+ }
+
+ public void setTeacher(Teacher teacher) {
+ this.teacher = teacher;
+ }
+
+}
+
Added: search/trunk/src/test/java/org/hibernate/search/test/bridge/StudentsSizeBridge.java
===================================================================
--- search/trunk/src/test/java/org/hibernate/search/test/bridge/StudentsSizeBridge.java (rev 0)
+++ search/trunk/src/test/java/org/hibernate/search/test/bridge/StudentsSizeBridge.java 2010-02-16 19:24:46 UTC (rev 18812)
@@ -0,0 +1,30 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.bridge.TwoWayStringBridge;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StudentsSizeBridge implements TwoWayStringBridge {
+
+ public Object stringToObject(String stringValue) {
+ if (null == stringValue || stringValue.equals("")) {
+ return 0;
+ }
+ return Integer.parseInt(stringValue);
+ }
+
+ public String objectToString(Object object) {
+ if (object instanceof Teacher) {
+ Teacher teacher = (Teacher) object;
+ if (teacher.getStudents() != null && teacher.getStudents().size() > 0)
+ return String.valueOf(teacher.getStudents().size());
+ else
+ return null;
+ } else {
+ throw new IllegalArgumentException(StudentsSizeBridge.class +
+ " used on a non-Teacher type: " + object.getClass());
+ }
+ }
+
+}
Added: search/trunk/src/test/java/org/hibernate/search/test/bridge/Teacher.java
===================================================================
--- search/trunk/src/test/java/org/hibernate/search/test/bridge/Teacher.java (rev 0)
+++ search/trunk/src/test/java/org/hibernate/search/test/bridge/Teacher.java 2010-02-16 19:24:46 UTC (rev 18812)
@@ -0,0 +1,63 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.*;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+ at Table(name = "teacher")
+ at ClassBridge(
+ name = "amount_of_students",
+ index = Index.UN_TOKENIZED,
+ store = Store.YES,
+ impl = StudentsSizeBridge.class
+)
+public class Teacher {
+
+ private Long id;
+ private String name;
+ private List<Student> students;
+
+
+ public Teacher() {
+ students = new ArrayList<Student>();
+ }
+
+ @Id
+ @GeneratedValue
+ @Column(name = "teacher_id")
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Column(name = "name")
+ @Field(index = Index.TOKENIZED, store = Store.YES)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "teacher")
+ public List<Student> getStudents() {
+ return students;
+ }
+
+ public void setStudents(List<Student> students) {
+ this.students = students;
+ }
+
+}
+
More information about the hibernate-commits
mailing list