[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