[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