[hibernate-commits] Hibernate SVN: r10600 - in branches/Lucene_Integration/HibernateExt/metadata/src: java/org/hibernate/lucene java/org/hibernate/lucene/bridge test/org/hibernate/lucene/test/bridge

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Oct 17 19:58:08 EDT 2006


Author: epbernard
Date: 2006-10-17 19:58:05 -0400 (Tue, 17 Oct 2006)
New Revision: 10600

Added:
   branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DateBridge.java
Modified:
   branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
   branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java
   branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java
   branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java
Log:
ANN-463 Clean DateBridge implementation, introduce @DateBridge

Added: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DateBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DateBridge.java	2006-10-17 21:37:58 UTC (rev 10599)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DateBridge.java	2006-10-17 23:58:05 UTC (rev 10600)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.lucene;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Documented;
+
+import org.hibernate.lucene.bridge.Resolution;
+
+/**
+ * Defines the temporal resolution of a given field
+ * Date are stored as String in GMT
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME)
+ at Target({ElementType.FIELD, ElementType.METHOD})
+ at Documented
+//TODO allow pattern yyyyMMdd?
+public @interface DateBridge {
+    Resolution value();
+}

Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java	2006-10-17 21:37:58 UTC (rev 10599)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java	2006-10-17 23:58:05 UTC (rev 10600)
@@ -1,8 +1,6 @@
 //$Id: $
 package org.hibernate.lucene.bridge;
 
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Member;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -11,7 +9,7 @@
 import org.hibernate.reflection.XMember;
 import org.hibernate.reflection.XClass;
 import org.hibernate.annotations.Parameter;
-import org.hibernate.lucene.util.BinderHelper;
+import org.hibernate.lucene.DateBridge;
 
 /**
  * @author Emmanuel Bernard
@@ -49,25 +47,16 @@
         builtInBridges.put( long.class.getName(), LONG );
         builtInBridges.put( String.class.getName(), STRING );
 
-		DATE_YEAR = createDateBridge( Resolution.YEAR );
-		DATE_MONTH = createDateBridge( Resolution.MONTH );
-		DATE_DAY = createDateBridge( Resolution.DAY );
-		DATE_HOUR = createDateBridge( Resolution.HOUR );
-		DATE_MINUTE = createDateBridge( Resolution.MINUTE );
-		DATE_SECOND = createDateBridge( Resolution.SECOND );
-		DATE_MILLISECOND = createDateBridge( Resolution.MILLISECOND );
+		DATE_YEAR = org.hibernate.lucene.bridge.DateBridge.DATE_YEAR;
+		DATE_MONTH = org.hibernate.lucene.bridge.DateBridge.DATE_MONTH;
+		DATE_DAY = org.hibernate.lucene.bridge.DateBridge.DATE_DAY;
+		DATE_HOUR = org.hibernate.lucene.bridge.DateBridge.DATE_HOUR;
+		DATE_MINUTE = org.hibernate.lucene.bridge.DateBridge.DATE_MINUTE;
+		DATE_SECOND = org.hibernate.lucene.bridge.DateBridge.DATE_SECOND;
+		DATE_MILLISECOND = org.hibernate.lucene.bridge.DateBridge.DATE_MILLISECOND;
 		builtInBridges.put( Date.class.getName(), DATE_MILLISECOND );
 	}
 
-	private static FieldBridge createDateBridge(Resolution resolution) {
-		DateBridge date;
-		Map params = new HashMap(1);
-		params.put( "resolution", resolution );
-		date = new DateBridge();
-		date.setParameterValues( params );
-		return new String2FieldBridgeAdaptor( date );
-	}
-
 	public static FieldBridge guessType(XMember member) {
 		FieldBridge bridge = null;
 		org.hibernate.lucene.FieldBridge bridgeAnn = member.getAnnotation( org.hibernate.lucene.FieldBridge.class );
@@ -94,7 +83,11 @@
                 throw new HibernateException("Unable to instanciate FieldBridge for " + member.getName(), e );
 			}
 		}
-		else {
+        else if ( member.isAnnotationPresent( DateBridge.class ) ) {
+            Resolution resolution = member.getAnnotation( DateBridge.class ).value();
+            bridge = org.hibernate.lucene.bridge.DateBridge.getDateField( resolution );
+        }
+        else {
 			//find in built-ins
 			XClass returnType = member.getType();
 			bridge = builtInBridges.get( returnType.getName() );

Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java	2006-10-17 21:37:58 UTC (rev 10599)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java	2006-10-17 23:58:05 UTC (rev 10600)
@@ -3,6 +3,7 @@
 
 import java.text.ParseException;
 import java.util.Date;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.lucene.document.DateTools;
@@ -11,12 +12,30 @@
 import org.hibernate.util.StringHelper;
 
 /**
+ * Bridge a java.util.Date to a String, truncated to the resolution
+ * Date are stored GMT based
+ * 
  * @author Emmanuel Bernard
  */
 public class DateBridge implements StringBridge, ParameterizedBridge {
-	DateTools.Resolution resolution;
 
-	public Object stringToObject(String stringValue) {
+    public static final String2FieldBridgeAdaptor DATE_YEAR = new String2FieldBridgeAdaptor( new DateBridge( Resolution.YEAR ) );
+	public static final String2FieldBridgeAdaptor DATE_MONTH = new String2FieldBridgeAdaptor( new DateBridge( Resolution.MONTH ) );
+	public static final String2FieldBridgeAdaptor DATE_DAY = new String2FieldBridgeAdaptor( new DateBridge( Resolution.DAY ) );
+	public static final String2FieldBridgeAdaptor DATE_HOUR = new String2FieldBridgeAdaptor( new DateBridge( Resolution.HOUR ) );
+	public static final String2FieldBridgeAdaptor DATE_MINUTE = new String2FieldBridgeAdaptor( new DateBridge( Resolution.MINUTE ) );
+	public static final String2FieldBridgeAdaptor DATE_SECOND = new String2FieldBridgeAdaptor( new DateBridge( Resolution.SECOND ) );
+	public static final String2FieldBridgeAdaptor DATE_MILLISECOND = new String2FieldBridgeAdaptor( new DateBridge( Resolution.MILLISECOND ) );
+
+    DateTools.Resolution resolution;
+
+    public DateBridge() {}
+
+    public DateBridge(Resolution resolution) {
+        setResolution( resolution );
+    }
+
+    public Object stringToObject(String stringValue) {
         if ( StringHelper.isEmpty(stringValue) ) return null;
         try {
 			return DateTools.stringToDate( stringValue );
@@ -33,32 +52,64 @@
 	}
 
 	public void setParameterValues(Map parameters) {
-		Resolution hibResolution = (Resolution) parameters.get( "resolution" );
-		switch ( hibResolution ) {
+        Object resolution = parameters.get( "resolution" );
+        Resolution hibResolution;
+        if (resolution instanceof String) {
+            hibResolution = Resolution.valueOf( ( (String) resolution ).toUpperCase( Locale.ENGLISH ) );
+        }
+        else {
+            hibResolution = (Resolution) resolution;
+        }
+        setResolution( hibResolution );
+    }
+
+    private void setResolution(Resolution hibResolution) {
+        switch ( hibResolution ) {
 			case YEAR:
-				resolution = DateTools.Resolution.YEAR;
+				this.resolution = DateTools.Resolution.YEAR;
 				break;
 			case MONTH:
-				resolution = DateTools.Resolution.MONTH;
+				this.resolution = DateTools.Resolution.MONTH;
 				break;
 			case DAY:
-				resolution = DateTools.Resolution.DAY;
+				this.resolution = DateTools.Resolution.DAY;
 				break;
 			case HOUR:
-				resolution = DateTools.Resolution.HOUR;
+				this.resolution = DateTools.Resolution.HOUR;
 				break;
 			case MINUTE:
-				resolution = DateTools.Resolution.MINUTE;
+				this.resolution = DateTools.Resolution.MINUTE;
 				break;
 			case SECOND:
-				resolution = DateTools.Resolution.SECOND;
+				this.resolution = DateTools.Resolution.SECOND;
 				break;
 			case MILLISECOND:
-				resolution = DateTools.Resolution.MILLISECOND;
+				this.resolution = DateTools.Resolution.MILLISECOND;
 				break;
 			default:
 				throw new AssertionFailure( "Unknown Resolution: " + hibResolution );
 
 		}
-	}
+    }
+
+    public static String2FieldBridgeAdaptor getDateField(Resolution resolution) {
+        switch( resolution ) {
+            case YEAR:
+				return DATE_YEAR;
+			case MONTH:
+				return DATE_MONTH;
+			case DAY:
+				return DATE_DAY;
+			case HOUR:
+				return DATE_HOUR;
+			case MINUTE:
+				return DATE_MINUTE;
+			case SECOND:
+				return DATE_SECOND;
+			case MILLISECOND:
+				return DATE_MILLISECOND;
+			default:
+				throw new AssertionFailure( "Unknown Resolution: " + resolution );
+        }
+    }
 }

Modified: branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java	2006-10-17 21:37:58 UTC (rev 10599)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java	2006-10-17 23:58:05 UTC (rev 10600)
@@ -5,6 +5,7 @@
 import java.util.List;
 import java.util.GregorianCalendar;
 import java.util.Calendar;
+import java.util.TimeZone;
 
 import org.hibernate.Transaction;
 
@@ -60,8 +61,19 @@
     public void testDateBridge() throws Exception {
         Cloud cloud = new Cloud();
         Calendar c = GregorianCalendar.getInstance();
-        c.set(2000, 11, 15);
-        cloud.setDate( c.getTime() );
+        c.setTimeZone( TimeZone.getTimeZone( "GMT" ) ); //for the sake of tests
+        c.set(2000, 11, 15, 3, 43, 2);
+        c.set( Calendar.MILLISECOND, 5 );
+
+        Date date = new Date( c.getTimeInMillis() );
+        cloud.setDate( date ); //5 millisecond
+        cloud.setDateDay( date );
+        cloud.setDateHour( date );
+        cloud.setDateMillisecond( date );
+        cloud.setDateMinute( date );
+        cloud.setDateMonth( date );
+        cloud.setDateSecond( date );
+        cloud.setDateYear( date );
         org.hibernate.Session s = openSession();
         Transaction tx = s.beginTransaction();
         s.persist(cloud);
@@ -74,9 +86,17 @@
         Query query;
         List result;
 
-        query = parser.parse("date:[19900101 TO 20060101]");
+        query = parser.parse("date:[19900101 TO 20060101]"
+                + " AND dateDay:[20001214 TO 2000121501]"
+                + " AND dateMonth:[200012 TO 20001201]"
+                + " AND dateYear:[2000 TO 200001]"
+                + " AND dateHour:[20001214 TO 2000121503]"
+                + " AND dateMinute:[20001214 TO 200012150343]"
+                + " AND dateSecond:[20001214 TO 20001215034302]"
+                + " AND dateMillisecond:[20001214 TO 20001215034302005]"
+        );
         result = session.createLuceneQuery(query).list();
-        assertEquals( "date found", 1, result.size() );
+        assertEquals( "Date not found or not property truncated", 1, result.size() );
 
         s.delete( s.get( Cloud.class, cloud.getId() ) );
         tx.commit();

Modified: branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java	2006-10-17 21:37:58 UTC (rev 10599)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java	2006-10-17 23:58:05 UTC (rev 10600)
@@ -8,10 +8,9 @@
 
 import org.hibernate.lucene.Keyword;
 import org.hibernate.lucene.Indexed;
-import org.hibernate.lucene.FieldBridge;
 import org.hibernate.lucene.Text;
-import org.hibernate.lucene.bridge.DateBridge;
-import org.hibernate.annotations.Parameter;
+import org.hibernate.lucene.DateBridge;
+import org.hibernate.lucene.bridge.Resolution;
 
 /**
  * @author Emmanuel Bernard
@@ -34,6 +33,7 @@
     private Date dateMonth;
     private Date dateDay;
     private Date dateHour;
+    private Date dateMinute;
     private Date dateSecond;
     private Date dateMillisecond;
 
@@ -126,7 +126,7 @@
     public void setString(String string) {
         this.string = string;
     }
-    //FIXME DATE and RESOLUTION
+
     @Keyword
     public Date getDate() {
         return date;
@@ -136,6 +136,8 @@
         this.date = date;
     }
 
+    @Keyword
+    @DateBridge( Resolution.YEAR )
     public Date getDateYear() {
         return dateYear;
     }
@@ -144,6 +146,8 @@
         this.dateYear = dateYear;
     }
 
+    @Keyword
+    @DateBridge( Resolution.MONTH )
     public Date getDateMonth() {
         return dateMonth;
     }
@@ -152,6 +156,8 @@
         this.dateMonth = dateMonth;
     }
 
+    @Keyword
+    @DateBridge( Resolution.DAY )
     public Date getDateDay() {
         return dateDay;
     }
@@ -160,6 +166,8 @@
         this.dateDay = dateDay;
     }
 
+    @Keyword
+    @DateBridge( Resolution.HOUR )
     public Date getDateHour() {
         return dateHour;
     }
@@ -168,6 +176,19 @@
         this.dateHour = dateHour;
     }
 
+
+    @Keyword
+    @DateBridge( Resolution.MINUTE )
+    public Date getDateMinute() {
+        return dateMinute;
+    }
+
+    public void setDateMinute(Date dateMinute) {
+        this.dateMinute = dateMinute;
+    }
+
+    @Keyword
+    @DateBridge( Resolution.SECOND )
     public Date getDateSecond() {
         return dateSecond;
     }
@@ -176,6 +197,8 @@
         this.dateSecond = dateSecond;
     }
 
+    @Keyword
+    @DateBridge( Resolution.MILLISECOND )
     public Date getDateMillisecond() {
         return dateMillisecond;
     }




More information about the hibernate-commits mailing list