You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2010/01/14 04:19:07 UTC

svn commit: r899043 - in /labs/magma/trunk/foundation-database: ./ src/main/java/org/apache/magma/database/ src/test/java/org/apache/magma/database/

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: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org