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