Author: simoneg
Date: Thu Jan 14 03:19:07 2010
New Revision: 899043

URL: http://svn.apache.org/viewvc?rev=899043&view=rev
Log:
Better integration for dates in query by example

Added:
    
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SimpleBean.java
    
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SpecificBean.java
Modified:
    labs/magma/trunk/foundation-database/pom.xml
    
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/AddDefaultJPAValidation.aj
    
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/pom.xml
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/pom.xml?rev=899043&r1=899042&r2=899043&view=diff
==============================================================================
--- labs/magma/trunk/foundation-database/pom.xml (original)
+++ labs/magma/trunk/foundation-database/pom.xml Thu Jan 14 03:19:07 2010
@@ -53,5 +53,11 @@
                        <artifactId>foundation-validation</artifactId>
                        <version>0.0.3-SNAPSHOT</version>
                </dependency>
+               <dependency>
+                       <groupId>org.apache.magma</groupId>
+                       <artifactId>foundation-i18n</artifactId>
+                       <version>0.0.3-SNAPSHOT</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 </project>
\ No newline at end of file

Modified: 
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/AddDefaultJPAValidation.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/AddDefaultJPAValidation.aj?rev=899043&r1=899042&r2=899043&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/AddDefaultJPAValidation.aj
 (original)
+++ 
labs/magma/trunk/foundation-database/src/main/java/org/apache/magma/database/AddDefaultJPAValidation.aj
 Thu Jan 14 03:19:07 2010
@@ -31,14 +31,22 @@
 public aspect AddDefaultJPAValidation {
 
        declare precedence : AddDefaultJPAValidation, 
AddValidatorInPropertyInfo;
+
+       private boolean PropertyInfo.jpaTransient = false;
+       
+       public boolean PropertyInfo.isJpaTransient() {
+               return jpaTransient;
+       }
        
        after(PropertyInfo info, PropertyDescriptor desc, Class beanClass) : 
                execution(* PropertyInfo.init(PropertyDescriptor, Class)) && 
this(info) && args(desc, beanClass) {
                
                if (info.getType() == null) return;
+               if (desc.getReadMethod().isAnnotationPresent(Transient.class)) 
info.jpaTransient = true;
+               
                if (!info.getType().equals(String.class)) return;
                if (!info.isWriteable() || !info.isReadable()) return;
-               
+
                CompoundValidator val = info.getValidator();
                if (val != null && val.getValidator(DatabaseValidator.class) != 
null) return;
                
@@ -49,7 +57,7 @@
                
                if (!isjpa) return;
                
-               if (desc.getReadMethod().isAnnotationPresent(Transient.class)) 
return;
+               if (info.isJpaTransient()) return;
                
                
                DatabaseValidator dbv = new DatabaseValidator();

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=899043&r1=899042&r2=899043&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
 Thu Jan 14 03:19:07 2010
@@ -10,14 +10,19 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.persistence.Transient;
 
 import org.apache.commons.beanutils.MethodUtils;
 import org.apache.magma.basics.MagmaException;
+import org.apache.magma.beans.BeanData;
+import org.apache.magma.beans.BeanHandler;
+import org.apache.magma.beans.MagmaBeanSupport;
+import org.apache.magma.beans.PropertyInfo;
 import org.apache.magma.database.QueryByExampleBean.QueryPart;
 
-public class QueryByExampleBuilder<T> {
+public class QueryByExampleBuilder<T extends MagmaBeanSupport> {
 
        private FieldSettings defaults = new FieldSettings();
        private Map<String, FieldSettings> settings;
@@ -59,17 +64,17 @@
                boolean wheresent = false;
                List<Object> params = new ArrayList<Object>();
                try {
-                       BeanInfo infos = 
Introspector.getBeanInfo(qbe.getClass());
-                       PropertyDescriptor[] descs = 
infos.getPropertyDescriptors();
-                       for (PropertyDescriptor desc : descs) {
-                               String name = desc.getName();
+                       BeanData bd = qbe.beanData();
+                       BeanHandler handler = qbe.handler();
+                       Set<String> names = bd.getPropertyNames();
+                       for (String name : names) {
                                if (ignoreds.contains(name)) continue;
-                               Class<?> type = desc.getPropertyType();
-                               type = MethodUtils.toNonPrimitiveClass(type);
+                               PropertyInfo desc = bd.getProperty(name);  
+                               Class<?> type = desc.getType();
                                if (type == null) continue;
-                               Method rm = desc.getReadMethod();
-                               if (rm == null || desc.getWriteMethod() == 
null) continue;
-                               if (rm.isAnnotationPresent(Transient.class)) 
continue;
+                               type = MethodUtils.toNonPrimitiveClass(type);
+                               if (!desc.isReadable() || !desc.isWriteable()) 
continue;
+                               if (desc.isJpaTransient()) continue;
                                FieldSettings settings = null;
                                if (this.settings != null) {
                                        settings = this.settings.get(name);
@@ -80,7 +85,7 @@
                                if (qbeb != null) part = 
qbeb.modifyQueryFor(name, settings);
                                if (qbeb == null || part == null) {
                                        if (type.equals(String.class)) {
-                                               String val = (String) 
rm.invoke(qbe);
+                                               String val = (String) 
handler.getValue(name);
                                                if (val == null || val.length() 
== 0) continue;
                                                boolean like = false;
                                                if (settings.getStartsLike()) {
@@ -107,7 +112,7 @@
                                                clause += "?" + (params.size() 
+ 1);
                                                params.add(val);                
                                
                                        } else if 
(Number.class.isAssignableFrom(type)) {
-                                               Number val = 
(Number)rm.invoke(qbe);
+                                               Number val = 
(Number)handler.getValue(name);
                                                if (val == null) continue;
                                                if (!settings.getConsiderZero() 
&& val.intValue() == 0) continue;
                                                clause = "x." + name;
@@ -115,25 +120,56 @@
                                                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);
+                                               Date val = 
(Date)handler.getValue(name);
                                                if (val == null) continue;
-                                               GregorianCalendar calendar = 
new GregorianCalendar();
-                                               calendar.setTime(val);
-                                               for (int calele : new int[] {
+                                               int[] elements = 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));
+                                                               
GregorianCalendar.MONTH };
+                                               int considerto = 0;
+                                               // TODO this is a hook to avoid 
depending on i18n, will be solved by LABS-152
+                                               try {
+                                                       Method getFormatter = 
PropertyInfo.class.getMethod("getFormatter");
+                                                       Object formatter = 
getFormatter.invoke(desc);
+                                                       Method getPattern = 
formatter.getClass().getMethod("getPattern");
+                                                       String pattern = 
(String) getPattern.invoke(formatter);
+                                                       if 
(pattern.indexOf('s') != -1) {
+                                                               considerto = 1;
+                                                       } else if 
(pattern.indexOf('m') != -1) {
+                                                               considerto = 2;
+                                                       } else if 
(pattern.indexOf('H') != -1 || pattern.indexOf('K') != -1 ) {
+                                                               considerto = 3;
+                                                       } else if 
(pattern.indexOf('h') != -1 || pattern.indexOf('k') != -1 ) {
+                                                               considerto = 3;
+                                                       } else if 
(pattern.indexOf('d') != -1 || pattern.indexOf('D') != -1 ) {
+                                                               considerto = 4;
+                                                       } else if 
(pattern.indexOf('M') != -1) {
+                                                               considerto = 5;
+                                                       } else if 
(pattern.indexOf('y') != -1) {
+                                                               considerto = 6;
+                                                       }                       
+                                               } catch (Exception e) {
+                                                       e.printStackTrace();
+                                               }
+                                               GregorianCalendar calendar = 
new GregorianCalendar();
+                                               calendar.setTime(val);
+                                               for (int i = 0; i < 
elements.length; i++) {
+                                                       if (i < considerto) {
+                                                               
calendar.set(elements[i], calendar.getActualMinimum(elements[i]));
+                                                       }
+                                               }
+                                               Date minval = 
calendar.getTime();
+                                               for (int i = 0; i < 
elements.length; i++) {
+                                                       if (i < considerto) {
+                                                               
calendar.set(elements[i], calendar.getActualMaximum(elements[i]));
                                                        }
                                                }
                                                clause = "(x." + name + ">=";
                                                clause += "?" + (params.size() 
+ 1);
-                                               params.add(val);        
+                                               params.add(minval);     
                                                clause += " AND x." + name + 
"<=";
                                                clause += "?" + (params.size() 
+ 1) + ")";
                                                params.add(calendar.getTime()); 
@@ -142,7 +178,7 @@
                                                        
Boolean.TYPE.isAssignableFrom(type) ||
                                                        type.isEnum() ||
                                                        
DatabasePersisted.class.isAssignableFrom(type)) {
-                                               Object val = rm.invoke(qbe);
+                                               Object val = 
handler.getValue(name);
                                                if (val == null) continue;
                                                clause = "x." + name;
                                                clause += "=?" + (params.size() 
+ 1);

Added: 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SimpleBean.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SimpleBean.java?rev=899043&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SimpleBean.java
 (added)
+++ 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SimpleBean.java
 Thu Jan 14 03:19:07 2010
@@ -0,0 +1,33 @@
+package org.apache.magma.database;
+
+import java.util.Date;
+
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.i18n.Format;
+
+...@magmabean
+public class SimpleBean {
+       private String name;
+       private int height;
+       private Date birthday;
+       
+       public String getName() {
+               return name;
+       }
+       public void setName(String name) {
+               this.name = name;
+       }
+       public int getHeight() {
+               return height;
+       }
+       public void setHeight(int height) {
+               this.height = height;
+       }
+       @Format(format="yyyy/MM/dd")
+       public Date getBirthday() {
+               return birthday;
+       }
+       public void setBirthday(Date birthday) {
+               this.birthday = birthday;
+       }
+}

Added: 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SpecificBean.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SpecificBean.java?rev=899043&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SpecificBean.java
 (added)
+++ 
labs/magma/trunk/foundation-database/src/test/java/org/apache/magma/database/SpecificBean.java
 Thu Jan 14 03:19:07 2010
@@ -0,0 +1,36 @@
+package org.apache.magma.database;
+
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.beans.MagmaBeanSupport;
+import org.apache.magma.database.QueryByExampleBean.QueryPart;
+import org.apache.magma.database.QueryByExampleBuilder.FieldSettings;
+
+...@magmabean
+public class SpecificBean implements QueryByExampleBean {
+       private String name;
+       private String state;
+       
+       public String getName() {
+               return name;
+       }
+       public void setName(String name) {
+               this.name = name;
+       }
+       public String getState() {
+               return state;
+       }
+       public void setState(String state) {
+               this.state = state;
+       }
+       
+       public QueryPart modifyQueryFor(String field, FieldSettings settings) {
+               if (field.equals("state") && this.getState() != null) {
+                       QueryPart ret = new QueryPart();
+                       ret.join = "LEFT JOIN x.locations location";
+                       ret.clause = "location.state=?1";
+                       ret.params.add(this.getState());
+                       return ret;
+               }
+               return null;
+       }
+}

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=899043&r1=899042&r2=899043&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
 Thu Jan 14 03:19:07 2010
@@ -7,6 +7,8 @@
 import java.util.Date;
 import java.util.GregorianCalendar;
 
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.beans.MagmaBeanSupport;
 import org.apache.magma.database.QueryByExampleBuilder.FieldSettings;
 import org.apache.magma.database.QueryByExampleBuilder.Query;
 import static org.apache.magma.testing.AssertStringStructure.assertStructure;
@@ -18,31 +20,6 @@
        @Test
        public void simpleQuery() throws Exception {
                
-               class SimpleBean {
-                       private String name;
-                       private int height;
-                       private Date birthday;
-                       
-                       public String getName() {
-                               return name;
-                       }
-                       public void setName(String name) {
-                               this.name = name;
-                       }
-                       public int getHeight() {
-                               return height;
-                       }
-                       public void setHeight(int height) {
-                               this.height = height;
-                       }
-                       public Date getBirthday() {
-                               return birthday;
-                       }
-                       public void setBirthday(Date birthday) {
-                               this.birthday = birthday;
-                       }
-               }
-               
                SimpleBean sb = new SimpleBean();
                QueryByExampleBuilder<SimpleBean> qbe = new 
QueryByExampleBuilder<SimpleBean>();
                Query query = qbe.generateQuery(sb);
@@ -50,14 +27,14 @@
                assertThat(query.params.length, equalTo(0));
                assertStructure(query.query, "!!WHERE");
                
-               sb.height = 178;
+               sb.setHeight(178);
                query = qbe.generateQuery(sb);
                System.out.println(query.query);
                assertThat(query.params.length, equalTo(1));
                assertStructure(query.query, "WHERE", "height", "=", "?1", 
"$$");
                
-               sb.height = 0;
-               sb.name="Simone";
+               sb.setHeight(0);
+               sb.setName("Simone");
                query = qbe.generateQuery(sb);
                System.out.println(query.query);
                assertThat(query.params.length, equalTo(1));
@@ -75,7 +52,7 @@
                assertThat(query.params.length, equalTo(1));
                assertStructure(query.query, "WHERE", "name", "=", "?1", "$$");
                
-               sb.height = 178;
+               sb.setHeight(178);
                query = qbe.generateQuery(sb);
                System.out.println(query.query);
                assertThat(query.params.length, equalTo(2));
@@ -90,20 +67,16 @@
 
                sb = new SimpleBean();
                GregorianCalendar cal = new GregorianCalendar();
+               cal.setTime(new Date());
                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[0]);
                assertThat(cal.get(GregorianCalendar.YEAR), equalTo(1979));
                assertThat(cal.get(GregorianCalendar.MONTH), 
equalTo(GregorianCalendar.MARCH));
@@ -125,35 +98,6 @@
        @Test
        public void qbeBean() throws Exception {
                
-               class SpecificBean implements QueryByExampleBean {
-                       private String name;
-                       private String state;
-                       
-                       public String getName() {
-                               return name;
-                       }
-                       public void setName(String name) {
-                               this.name = name;
-                       }
-                       public String getState() {
-                               return state;
-                       }
-                       public void setState(String state) {
-                               this.state = state;
-                       }
-                       
-                       public QueryPart modifyQueryFor(String field, 
FieldSettings settings) {
-                               if (field.equals("state") && this.getState() != 
null) {
-                                       QueryPart ret = new QueryPart();
-                                       ret.join = "LEFT JOIN x.locations 
location";
-                                       ret.clause = "location.state=?1";
-                                       ret.params.add(this.getState());
-                                       return ret;
-                               }
-                               return null;
-                       }
-               }
-               
                SpecificBean sb = new SpecificBean();
                QueryByExampleBuilder<SpecificBean> qbe = new 
QueryByExampleBuilder<SpecificBean>();
                Query query = qbe.generateQuery(sb);
@@ -161,14 +105,14 @@
                assertThat(query.params.length, equalTo(0));
                assertStructure(query.query, "!!WHERE");
                
-               sb.name = "foo";
+               sb.setName("foo");
                query = qbe.generateQuery(sb);
                System.out.println(query.query);
                assertThat(query.params.length, equalTo(1));
                assertStructure(query.query, "WHERE", "LOWER(x.name)", "LIKE", 
"?1", "$$");
                
-               sb.name=null;
-               sb.state = "Alabama";
+               sb.setName(null);
+               sb.setState("Alabama");
                query = qbe.generateQuery(sb);
                System.out.println(query.from);
                System.out.println(query.query);
@@ -176,8 +120,8 @@
                assertStructure(query.from, "FROM", 
SpecificBean.class.getName(), "x", "LEFT JOIN", "x.locations", "location", 
"$$");
                assertStructure(query.query, "WHERE", "location.state", "=", 
"?1", "$$");
 
-               sb.name="foo";
-               sb.state = "Alabama";
+               sb.setName("foo");
+               sb.setState("Alabama");
                query = qbe.generateQuery(sb);
                System.out.println(query.from);
                System.out.println(query.query);



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

Reply via email to