Author: simoneg
Date: Tue Dec 15 16:16:40 2009
New Revision: 890858

URL: http://svn.apache.org/viewvc?rev=890858&view=rev
Log:
Use ranges in dates, trying to guess the significant part

Modified:
    
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/QueryByExampleBuilder.java
    
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/TestQbe.java

Modified: 
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/QueryByExampleBuilder.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/QueryByExampleBuilder.java?rev=890858&r1=890857&r2=890858&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/QueryByExampleBuilder.java
 (original)
+++ 
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/QueryByExampleBuilder.java
 Tue Dec 15 16:16:40 2009
@@ -6,6 +6,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -100,7 +101,32 @@
                                        if (!settings.getConsiderZero() && 
val.intValue() == 0) continue;
                                        clause = "x." + name;
                                        clause += "=?" + (params.size() + 1);
-                                       params.add(val);                        
        
+                                       params.add(val);        
+                               } else if (Date.class.isAssignableFrom(type)) {
+                                       // Try to create a range around 
meaningful part of a date.
+                                       Date val = (Date) rm.invoke(qbe);
+                                       if (val == null) continue;
+                                       GregorianCalendar calendar = new 
GregorianCalendar();
+                                       calendar.setTime(val);
+                                       for (int calele : new int[] {
+                                                       
GregorianCalendar.MILLISECOND,
+                                                       
GregorianCalendar.SECOND,
+                                                       
GregorianCalendar.MINUTE,
+                                                       
GregorianCalendar.HOUR_OF_DAY,
+                                                       
GregorianCalendar.DAY_OF_MONTH,
+                                                       GregorianCalendar.MONTH
+                                               }) {
+                                               if (calendar.get(calele) == 
calendar.getActualMinimum(calele)) {
+                                                       calendar.set(calele, 
calendar.getActualMaximum(calele));
+                                               }
+                                       }
+                                       clause = "(x." + name + ">=";
+                                       clause += "?" + (params.size() + 1);
+                                       params.add(val);        
+                                       clause += " AND x." + name + "<=";
+                                       clause += "?" + (params.size() + 1) + 
")";
+                                       params.add(calendar.getTime()); 
+                                       
                                } else {
                                        Object val = rm.invoke(qbe);
                                        if (val == null) continue;

Modified: 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/TestQbe.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/TestQbe.java?rev=890858&r1=890857&r2=890858&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/TestQbe.java
 (original)
+++ 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/TestQbe.java
 Tue Dec 15 16:16:40 2009
@@ -5,6 +5,7 @@
 import static org.hamcrest.CoreMatchers.*;
 
 import java.util.Date;
+import java.util.GregorianCalendar;
 
 import org.apache.magma.database.QueryByExampleBuilder.Query;
 import static org.apache.magma.testing.AssertStringStructure.assertStructure;
@@ -84,6 +85,29 @@
                System.out.println(query.query);
                assertThat(query.params.length, equalTo(2));
                assertStructure(query.query, "WHERE", "?1", "OR", "?2", "$$");  
        
+               
+
+               sb = new SimpleBean();
+               GregorianCalendar cal = new GregorianCalendar();
+               cal.set(GregorianCalendar.YEAR, 1979);
+               cal.set(GregorianCalendar.MONTH, GregorianCalendar.MARCH);
+               cal.set(GregorianCalendar.DAY_OF_MONTH, 5);
+               cal.set(GregorianCalendar.HOUR_OF_DAY, 0);
+               cal.set(GregorianCalendar.MINUTE, 0);
+               cal.set(GregorianCalendar.SECOND, 0);
+               cal.set(GregorianCalendar.MILLISECOND, 0);
+               sb.setBirthday(cal.getTime());
+               qbe.setUseOr(false);            
+               query = qbe.generateQuery(sb);
+               System.out.println(query.query);
+               assertThat(query.params.length, equalTo(2));
+               assertStructure(query.query, "WHERE", "x.birthday", ">=", "?1", 
"AND", "x.birthday", "<=", "?2", ")", "$$");
+               assertThat((Date)query.params[0], equalTo(cal.getTime()));
+               cal.setTime((Date) query.params[1]);
+               assertThat(cal.get(GregorianCalendar.HOUR_OF_DAY), equalTo(23));
+               assertThat(cal.get(GregorianCalendar.MINUTE), equalTo(59));
+               assertThat(cal.get(GregorianCalendar.SECOND), equalTo(59));
+               assertThat(cal.get(GregorianCalendar.MILLISECOND), 
equalTo(999));
        }
        
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to