You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2014/10/06 08:39:13 UTC
git commit: METAMODEL-83: Added OperatorTypes "<=" and ">="
Repository: incubator-metamodel
Updated Branches:
refs/heads/master 560dd6600 -> 41185dfc9
METAMODEL-83: Added OperatorTypes "<=" and ">="
Project: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/commit/41185dfc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/tree/41185dfc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/diff/41185dfc
Branch: refs/heads/master
Commit: 41185dfc9a4ffaec26a84191c1754ff87fab8c69
Parents: 560dd66
Author: Francisco Javier Cano <fj...@stratio.com>
Authored: Mon Oct 6 08:39:06 2014 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Mon Oct 6 08:39:06 2014 +0200
----------------------------------------------------------------------
.../org/apache/metamodel/query/FilterItem.java | 42 +++--
.../apache/metamodel/query/OperatorType.java | 31 ++-
.../query/builder/AbstractFilterBuilder.java | 159 +++++++++++++++-
.../builder/AbstractQueryFilterBuilder.java | 118 +++++++++++-
.../metamodel/query/builder/FilterBuilder.java | 136 ++++++++++++--
.../apache/metamodel/query/FilterItemTest.java | 42 ++++-
.../couchdb/CouchDbDataContextTest.java | 37 ++++
.../metamodel/jdbc/JdbcDataContextTest.java | 188 +++++++++++++++----
.../metamodel/mongodb/MongoDbDataContext.java | 44 ++---
.../mongodb/MongoDbDataContextTest.java | 61 +++++-
pom.xml | 3 +-
11 files changed, 727 insertions(+), 134 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/core/src/main/java/org/apache/metamodel/query/FilterItem.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/FilterItem.java b/core/src/main/java/org/apache/metamodel/query/FilterItem.java
index 8893fb1..9984401 100644
--- a/core/src/main/java/org/apache/metamodel/query/FilterItem.java
+++ b/core/src/main/java/org/apache/metamodel/query/FilterItem.java
@@ -38,7 +38,7 @@ import org.apache.metamodel.util.WildcardPattern;
/**
* Represents a filter in a query that resides either within a WHERE clause or a
* HAVING clause
- *
+ *
* @see FilterClause
* @see OperatorType
* @see LogicalOperator
@@ -80,13 +80,15 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Creates a single filter item based on a SelectItem, an operator and an
* operand.
- *
+ *
* @param selectItem
* the selectItem to put constraints on, cannot be null
* @param operator
* The operator to use. Can be OperatorType.EQUALS_TO,
* OperatorType.DIFFERENT_FROM,
* OperatorType.GREATER_THAN,OperatorType.LESS_THAN
+ * OperatorType.GREATER_THAN_OR_EQUAL,
+ * OperatorType.LESS_THAN_OR_EQUAL
* @param operand
* The operand. Can be a constant like null or a String, a
* Number, a Boolean, a Date, a Time, a DateTime. Or another
@@ -115,10 +117,10 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
* Creates a single unvalidated filter item based on a expression.
* Expression based filters are typically NOT datastore-neutral but are
* available for special "hacking" needs.
- *
+ *
* Expression based filters can only be used for JDBC based datastores since
* they are translated directly into SQL.
- *
+ *
* @param expression
* An expression to use for the filter, for example
* "YEAR(my_date) = 2008".
@@ -133,7 +135,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
* Creates a composite filter item based on other filter items. Each
* provided filter items will be OR'ed meaning that if one of the evaluates
* as true, then the composite filter will be evaluated as true
- *
+ *
* @param items
* a list of items to include in the composite
*/
@@ -144,7 +146,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Creates a compound filter item based on other filter items. Each provided
* filter item will be combined according to the {@link LogicalOperator}.
- *
+ *
* @param logicalOperator
* the logical operator to apply
* @param items
@@ -160,7 +162,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Creates a compound filter item based on other filter items. Each provided
* filter item will be combined according to the {@link LogicalOperator}.
- *
+ *
* @param logicalOperator
* the logical operator to apply
* @param items
@@ -174,7 +176,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
* Creates a compound filter item based on other filter items. Each provided
* filter items will be OR'ed meaning that if one of the evaluates as true,
* then the compound filter will be evaluated as true
- *
+ *
* @param items
* an array of items to include in the composite
*/
@@ -302,9 +304,15 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
case GREATER_THAN:
sb.append(" > ");
break;
+ case GREATER_THAN_OR_EQUAL:
+ sb.append(" >= ");
+ break;
case LESS_THAN:
sb.append(" < ");
break;
+ case LESS_THAN_OR_EQUAL:
+ sb.append(" <= ");
+ break;
case IN:
sb.append(" IN ");
operand = CollectionUtils.toList(operand);
@@ -380,8 +388,12 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
return comparator.compare(selectItemValue, operandValue) == 0;
} else if (_operator == OperatorType.GREATER_THAN) {
return comparator.compare(selectItemValue, operandValue) > 0;
+ } else if (_operator == OperatorType.GREATER_THAN_OR_EQUAL) {
+ return comparator.compare(selectItemValue, operandValue) >= 0;
} else if (_operator == OperatorType.LESS_THAN) {
return comparator.compare(selectItemValue, operandValue) < 0;
+ } else if (_operator == OperatorType.LESS_THAN_OR_EQUAL) {
+ return comparator.compare(selectItemValue, operandValue) <= 0;
} else if (_operator == OperatorType.LIKE) {
WildcardPattern matcher = new WildcardPattern((String) operandValue, '%');
return matcher.matches((String) selectItemValue);
@@ -395,7 +407,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Lazy initializes a set (for fast searching) of IN values.
- *
+ *
* @return a hash set appropriate for IN clause evaluation
*/
private Set<?> getInValues() {
@@ -472,8 +484,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Gets the {@link FilterItem}s that this filter item consists of, if it is
* a compound filter item.
- *
- * @return
+ *
* @deprecated use {@link #getChildItems()} instead
*/
@Deprecated
@@ -483,8 +494,7 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Gets the number of child items, if this is a compound filter item.
- *
- * @return
+ *
* @deprecated use {@link #getChildItemCount()} instead.
*/
@Deprecated
@@ -494,8 +504,6 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Get the number of child items, if this is a compound filter item.
- *
- * @return
*/
public int getChildItemCount() {
if (_childItems == null) {
@@ -507,8 +515,6 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Gets the {@link FilterItem}s that this filter item consists of, if it is
* a compound filter item.
- *
- * @return
*/
public FilterItem[] getChildItems() {
if (_childItems == null) {
@@ -520,8 +526,6 @@ public class FilterItem extends BaseObject implements QueryItem, Cloneable, IRow
/**
* Determines whether this {@link FilterItem} is a compound filter or not
* (ie. if it has child items or not)
- *
- * @return
*/
public boolean isCompoundFilter() {
return _childItems != null;
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/core/src/main/java/org/apache/metamodel/query/OperatorType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/OperatorType.java b/core/src/main/java/org/apache/metamodel/query/OperatorType.java
index 5a0d281..e668da8 100644
--- a/core/src/main/java/org/apache/metamodel/query/OperatorType.java
+++ b/core/src/main/java/org/apache/metamodel/query/OperatorType.java
@@ -20,13 +20,26 @@ package org.apache.metamodel.query;
/**
* Defines the types of operators that can be used in filters.
- *
+ *
* @see FilterItem
*/
public enum OperatorType {
- EQUALS_TO("=", false), DIFFERENT_FROM("<>", false), LIKE("LIKE", true), GREATER_THAN(">", false), LESS_THAN("<",
- false), IN("IN", true);
+ EQUALS_TO("=", false),
+
+ DIFFERENT_FROM("<>", false),
+
+ LIKE("LIKE", true),
+
+ GREATER_THAN(">", false),
+
+ GREATER_THAN_OR_EQUAL(">=", false),
+
+ LESS_THAN("<", false),
+
+ LESS_THAN_OR_EQUAL("<=", false),
+
+ IN("IN", true);
private final String _sql;
private final boolean _spaceDelimited;
@@ -37,9 +50,8 @@ public enum OperatorType {
}
/**
- * Determines if this operator requires a space delimitor. Operators that are written using letters usually require space delimitation whereas sign-based operators such as "=" and "<" can be applied even without any delimitaton.
- *
- * @return
+ * Determines if this operator requires a space delimitor. Operators that are written using letters usually require
+ * space delimitation whereas sign-based operators such as "=" and "<" can be applied even without any delimitaton.
*/
public boolean isSpaceDelimited() {
return _spaceDelimited;
@@ -50,10 +62,9 @@ public enum OperatorType {
}
/**
- * Converts from SQL string literals to an OperatorType. Valid SQL values
- * are "=", "<>", "LIKE", ">" and "<".
- *
- * @param sqlType
+ * Converts from SQL string literals to an OperatorType. Valid SQL values are "=", "<>", "LIKE", ">", ">=", "<" and
+ * "<=".
+ *
* @return a OperatorType object representing the specified SQL type
*/
public static OperatorType convertOperatorType(String sqlType) {
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/core/src/main/java/org/apache/metamodel/query/builder/AbstractFilterBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/AbstractFilterBuilder.java b/core/src/main/java/org/apache/metamodel/query/builder/AbstractFilterBuilder.java
index 482a6eb..f14b4af 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/AbstractFilterBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/AbstractFilterBuilder.java
@@ -43,9 +43,6 @@ public abstract class AbstractFilterBuilder<B> implements FilterBuilder<B> {
/**
* Provides a way to
- *
- * @param queryParameter
- * @return
*/
public B applyFilter(OperatorType operator, Object operand) {
return applyFilter(new FilterItem(_selectItem, operator, operand));
@@ -283,7 +280,7 @@ public abstract class AbstractFilterBuilder<B> implements FilterBuilder<B> {
}
return applyFilter(new FilterItem(_selectItem, OperatorType.LESS_THAN, string));
}
-
+
@Override
public B lessThan(Object obj) {
if (obj instanceof Number) {
@@ -297,7 +294,7 @@ public abstract class AbstractFilterBuilder<B> implements FilterBuilder<B> {
}
throw new UnsupportedOperationException("Argument must be a Number, Date or String. Found: " + obj);
}
-
+
@Override
public B greaterThan(Object obj) {
if (obj instanceof Number) {
@@ -312,6 +309,148 @@ public abstract class AbstractFilterBuilder<B> implements FilterBuilder<B> {
throw new UnsupportedOperationException("Argument must be a Number, Date or String. Found: " + obj);
}
+ // Greater than or equals
+
+ @Override
+ public B greaterThanOrEquals(Column column) {
+ if (column == null) {
+ throw new IllegalArgumentException("column cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.GREATER_THAN_OR_EQUAL, new SelectItem(column)));
+ }
+
+ @Override
+ public B gte(Column column) {
+ return greaterThanOrEquals(column);
+ }
+
+ @Override
+ public B greaterThanOrEquals(Date date) {
+ if (date == null) {
+ throw new IllegalArgumentException("date cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.GREATER_THAN_OR_EQUAL, date));
+ }
+
+ @Override
+ public B gte(Date date) {
+ return greaterThanOrEquals(date);
+ }
+
+ @Override
+ public B greaterThanOrEquals(Number number) {
+ if (number == null) {
+ throw new IllegalArgumentException("number cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.GREATER_THAN_OR_EQUAL, number));
+ }
+
+ @Override
+ public B gte(Number number) {
+ return greaterThanOrEquals(number);
+ }
+
+ @Override
+ public B greaterThanOrEquals(String string) {
+ if (string == null) {
+ throw new IllegalArgumentException("string cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.GREATER_THAN_OR_EQUAL, string));
+ }
+
+ public B gte(String string) {
+ return greaterThanOrEquals(string);
+ }
+
+ @Override
+ public B greaterThanOrEquals(Object obj) {
+ if (obj instanceof Number) {
+ return greaterThanOrEquals((Number) obj);
+ }
+ if (obj instanceof Date) {
+ return greaterThanOrEquals((Date) obj);
+ }
+ if (obj instanceof String) {
+ return greaterThanOrEquals((String) obj);
+ }
+ throw new UnsupportedOperationException("Argument must be a Number, Date or String. Found: " + obj);
+ }
+
+ public B gte(Object obj) {
+ return greaterThanOrEquals(obj);
+ }
+
+ // Less than or equals
+
+ @Override
+ public B lessThanOrEquals(Column column) {
+ if (column == null) {
+ throw new IllegalArgumentException("column cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.LESS_THAN_OR_EQUAL, new SelectItem(column)));
+ }
+
+ @Override
+ public B lte(Column column) {
+ return lessThanOrEquals(column);
+ }
+
+ @Override
+ public B lessThanOrEquals(Date date) {
+ if (date == null) {
+ throw new IllegalArgumentException("date cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.LESS_THAN_OR_EQUAL, date));
+ }
+
+ @Override
+ public B lte(Date date) {
+ return lessThanOrEquals(date);
+ }
+
+ @Override
+ public B lessThanOrEquals(Number number) {
+ if (number == null) {
+ throw new IllegalArgumentException("number cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.LESS_THAN_OR_EQUAL, number));
+ }
+
+ @Override
+ public B lte(Number number) {
+ return lessThanOrEquals(number);
+ }
+
+ @Override
+ public B lessThanOrEquals(String string) {
+ if (string == null) {
+ throw new IllegalArgumentException("string cannot be null");
+ }
+ return applyFilter(new FilterItem(_selectItem, OperatorType.LESS_THAN_OR_EQUAL, string));
+ }
+
+ public B lte(String string) {
+ return lessThanOrEquals(string);
+ }
+
+ @Override
+ public B lessThanOrEquals(Object obj) {
+ if (obj instanceof Number) {
+ return lessThanOrEquals((Number) obj);
+ }
+ if (obj instanceof Date) {
+ return lessThanOrEquals((Date) obj);
+ }
+ if (obj instanceof String) {
+ return lessThanOrEquals((String) obj);
+ }
+ throw new UnsupportedOperationException("Argument must be a Number, Date or String. Found: " + obj);
+ }
+
+ public B lte(Object obj) {
+ return lessThanOrEquals(obj);
+ }
+
@Override
public B like(String string) {
if (string == null) {
@@ -347,15 +486,15 @@ public abstract class AbstractFilterBuilder<B> implements FilterBuilder<B> {
public B lt(Date date) {
return lessThan(date);
- };
+ }
public B lt(Number number) {
return lessThan(number);
- };
+ }
public B lt(String string) {
return lessThan(string);
- };
+ }
@Override
public B eq(Boolean bool) {
@@ -446,12 +585,12 @@ public abstract class AbstractFilterBuilder<B> implements FilterBuilder<B> {
public B equals(String string) {
return isEquals(string);
}
-
+
@Override
public B lt(Object obj) {
return lessThan(obj);
}
-
+
@Override
public B gt(Object obj) {
return greaterThan(obj);
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/core/src/main/java/org/apache/metamodel/query/builder/AbstractQueryFilterBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/AbstractQueryFilterBuilder.java b/core/src/main/java/org/apache/metamodel/query/builder/AbstractQueryFilterBuilder.java
index 444ab2e..133bce0 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/AbstractQueryFilterBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/AbstractQueryFilterBuilder.java
@@ -90,7 +90,7 @@ abstract class AbstractQueryFilterBuilder<B> extends GroupedQueryBuilderCallback
public B isEquals(Boolean bool) {
return _filterBuilder.isEquals(bool);
}
-
+
@Override
public B isEquals(Object obj) {
return _filterBuilder.isEquals(obj);
@@ -135,7 +135,7 @@ abstract class AbstractQueryFilterBuilder<B> extends GroupedQueryBuilderCallback
public B greaterThan(Column column) {
return _filterBuilder.greaterThan(column);
}
-
+
@Override
public B greaterThan(Object obj) {
return _filterBuilder.greaterThan(obj);
@@ -193,13 +193,113 @@ abstract class AbstractQueryFilterBuilder<B> extends GroupedQueryBuilderCallback
public B lessThan(String string) {
return _filterBuilder.lessThan(string);
}
-
+
@Override
public B lessThan(Object obj) {
return _filterBuilder.lessThan(obj);
}
@Override
+ public B greaterThanOrEquals(Column column) {
+ return _filterBuilder.greaterThanOrEquals(column);
+ }
+
+ @Override
+ public B greaterThanOrEquals(Date date) {
+ return _filterBuilder.greaterThanOrEquals(date);
+ }
+
+ @Override
+ public B greaterThanOrEquals(Number number) {
+ return _filterBuilder.greaterThanOrEquals(number);
+ }
+
+ @Override
+ public B greaterThanOrEquals(String string) {
+ return _filterBuilder.greaterThanOrEquals(string);
+ }
+
+ @Override
+ public B greaterThanOrEquals(Object obj) {
+ return _filterBuilder.greaterThanOrEquals(obj);
+ }
+
+ @Override
+ public B gte(Column column) {
+ return _filterBuilder.greaterThanOrEquals(column);
+ }
+
+ @Override
+ public B gte(Date date) {
+ return _filterBuilder.greaterThanOrEquals(date);
+ }
+
+ @Override
+ public B gte(Number number) {
+ return _filterBuilder.greaterThanOrEquals(number);
+ }
+
+ @Override
+ public B gte(String string) {
+ return _filterBuilder.greaterThanOrEquals(string);
+ }
+
+ @Override
+ public B gte(Object obj) {
+ return _filterBuilder.greaterThanOrEquals(obj);
+ }
+
+ @Override
+ public B lessThanOrEquals(Column column) {
+ return _filterBuilder.lessThanOrEquals(column);
+ }
+
+ @Override
+ public B lessThanOrEquals(Date date) {
+ return _filterBuilder.lessThanOrEquals(date);
+ }
+
+ @Override
+ public B lessThanOrEquals(Number number) {
+ return _filterBuilder.lessThanOrEquals(number);
+ }
+
+ @Override
+ public B lessThanOrEquals(String string) {
+ return _filterBuilder.lessThanOrEquals(string);
+ }
+
+ @Override
+ public B lessThanOrEquals(Object obj) {
+ return _filterBuilder.lessThanOrEquals(obj);
+ }
+
+ @Override
+ public B lte(Column column) {
+ return _filterBuilder.lessThanOrEquals(column);
+ }
+
+ @Override
+ public B lte(Date date) {
+ return _filterBuilder.lessThanOrEquals(date);
+ }
+
+ @Override
+ public B lte(Number number) {
+ return _filterBuilder.lessThanOrEquals(number);
+ }
+
+ @Override
+ public B lte(String string) {
+ return _filterBuilder.lessThanOrEquals(string);
+ }
+
+ @Override
+ public B lte(Object obj) {
+ return _filterBuilder.lessThanOrEquals(obj);
+ }
+
+ @Override
public B like(String string) {
return _filterBuilder.like(string);
}
@@ -231,15 +331,15 @@ abstract class AbstractQueryFilterBuilder<B> extends GroupedQueryBuilderCallback
public B lt(Date date) {
return lessThan(date);
- };
+ }
public B lt(Number number) {
return lessThan(number);
- };
+ }
public B lt(String string) {
return lessThan(string);
- };
+ }
@Override
public B eq(Boolean bool) {
@@ -330,15 +430,15 @@ abstract class AbstractQueryFilterBuilder<B> extends GroupedQueryBuilderCallback
public B equals(String string) {
return isEquals(string);
}
-
+
@Override
public B lt(Object obj) {
return lessThan(obj);
}
-
+
@Override
public B gt(Object obj) {
return greaterThan(obj);
}
-
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/core/src/main/java/org/apache/metamodel/query/builder/FilterBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/FilterBuilder.java b/core/src/main/java/org/apache/metamodel/query/builder/FilterBuilder.java
index 01f2822..8ba1f62 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/FilterBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/FilterBuilder.java
@@ -25,7 +25,7 @@ import org.apache.metamodel.schema.Column;
/**
* Interface for builder callbacks that "respond" to filter condition building.
- *
+ *
* @param <B>
* the builder type to return once filter has been created.
*/
@@ -58,7 +58,7 @@ public interface FilterBuilder<B> {
/**
* Like ...
- *
+ *
* (use '%' as wildcard).
*/
public B like(String string);
@@ -87,7 +87,7 @@ public interface FilterBuilder<B> {
* Equal to ...
*/
public B eq(Boolean bool);
-
+
/**
* Equal to ...
*/
@@ -117,7 +117,7 @@ public interface FilterBuilder<B> {
* Equal to ...
*/
public B isEquals(Boolean bool);
-
+
/**
* Equal to ...
*/
@@ -125,7 +125,7 @@ public interface FilterBuilder<B> {
/**
* Equal to ...
- *
+ *
* @deprecated use 'eq' or 'isEquals' instead.
*/
@Deprecated
@@ -133,7 +133,7 @@ public interface FilterBuilder<B> {
/**
* Equal to ...
- *
+ *
* @deprecated use 'eq' or 'isEquals' instead.
*/
@Deprecated
@@ -141,7 +141,7 @@ public interface FilterBuilder<B> {
/**
* Equal to ...
- *
+ *
* @deprecated use 'eq' or 'isEquals' instead.
*/
@Deprecated
@@ -149,7 +149,7 @@ public interface FilterBuilder<B> {
/**
* Equal to ...
- *
+ *
* @deprecated use 'eq' or 'isEquals' instead.
*/
@Deprecated
@@ -157,7 +157,7 @@ public interface FilterBuilder<B> {
/**
* Equal to ...
- *
+ *
* @deprecated use 'eq' or 'isEquals' instead.
*/
@Deprecated
@@ -187,7 +187,7 @@ public interface FilterBuilder<B> {
* Not equal to ...
*/
public B differentFrom(Boolean bool);
-
+
/**
* Not equal to ...
*/
@@ -217,7 +217,7 @@ public interface FilterBuilder<B> {
* Not equal to ...
*/
public B ne(Boolean bool);
-
+
/**
* Not equal to ...
*/
@@ -225,7 +225,7 @@ public interface FilterBuilder<B> {
/**
* Greater than ...
- *
+ *
* @deprecated use {@link #greaterThan(Column)} instead
*/
@Deprecated
@@ -240,12 +240,12 @@ public interface FilterBuilder<B> {
* Greater than ...
*/
public B gt(Column column);
-
+
/**
* Greater than ...
*/
public B greaterThan(Object obj);
-
+
/**
* Greater than ...
*/
@@ -253,7 +253,7 @@ public interface FilterBuilder<B> {
/**
* Greater than ...
- *
+ *
* @deprecated use {@link #greaterThan(Date)} instead
*/
@Deprecated
@@ -287,7 +287,7 @@ public interface FilterBuilder<B> {
/**
* Greater than ...
- *
+ *
* @deprecated use {@link #greaterThan(String)} instead
*/
@Deprecated
@@ -327,12 +327,12 @@ public interface FilterBuilder<B> {
* Less than ...
*/
public B lessThan(String string);
-
+
/**
* Less than ...
*/
public B lessThan(Object obj);
-
+
/**
* Less than ...
*/
@@ -352,4 +352,104 @@ public interface FilterBuilder<B> {
* Less than ...
*/
public B lt(String string);
+
+ /**
+ * Greater than or equals...
+ */
+ public B greaterThanOrEquals(Column column);
+
+ /**
+ * Greater than or equals...
+ */
+ public B gte(Column column);
+
+ /**
+ * Greater than or equals...
+ */
+ public B greaterThanOrEquals(Date date);
+
+ /**
+ * Greater than or equals...
+ */
+ public B gte(Date date);
+
+ /**
+ * Greater than or equals...
+ */
+ public B greaterThanOrEquals(Number number);
+
+ /**
+ * Greater than or equals...
+ */
+ public B gte(Number number);
+
+ /**
+ * Greater than or equals...
+ */
+ public B greaterThanOrEquals(String string);
+
+ /**
+ * Greater than or equals...
+ */
+ public B gte(String string);
+
+ /**
+ * Greater than or equals...
+ */
+ public B greaterThanOrEquals(Object obj);
+
+ /**
+ * Greater than or equals...
+ */
+ public B gte(Object obj);
+
+ /**
+ * Less than or equals...
+ */
+ public B lessThanOrEquals(Column column);
+
+ /**
+ * Less than or equals...
+ */
+ public B lte(Column column);
+
+ /**
+ * Less than or equals...
+ */
+ public B lessThanOrEquals(Date date);
+
+ /**
+ * Less than or equals...
+ */
+ public B lte(Date date);
+
+ /**
+ * Less than or equals...
+ */
+ public B lessThanOrEquals(Number number);
+
+ /**
+ * Less than or equals...
+ */
+ public B lte(Number number);
+
+ /**
+ * Less than or equals...
+ */
+ public B lessThanOrEquals(String string);
+
+ /**
+ * Less than or equals...
+ */
+ public B lte(String string);
+
+ /**
+ * Less than or equals...
+ */
+ public B lessThanOrEquals(Object obj);
+
+ /**
+ * Less than or equals...
+ */
+ public B lte(Object obj);
}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java b/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
index 818424a..2fedfb9 100644
--- a/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
@@ -18,11 +18,6 @@
*/
package org.apache.metamodel.query;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
import junit.framework.TestCase;
import org.apache.metamodel.DataContext;
@@ -44,6 +39,11 @@ import org.apache.metamodel.schema.Schema;
import org.apache.metamodel.schema.Table;
import org.apache.metamodel.schema.TableType;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
public class FilterItemTest extends TestCase {
public void testExpressionBasedFilter() throws Exception {
@@ -100,6 +100,12 @@ public class FilterItemTest extends TestCase {
c = new FilterItem(selectItem, OperatorType.EQUALS_TO, true);
assertEquals("Col1 = 1", c.toString());
+ c = new FilterItem(selectItem, OperatorType.GREATER_THAN_OR_EQUAL, 123);
+ assertEquals("Col1 >= 123", c.toString());
+
+ c = new FilterItem(selectItem, OperatorType.LESS_THAN_OR_EQUAL, 123);
+ assertEquals("Col1 <= 123", c.toString());
+
Column timeColumn = new MutableColumn("TimeCol", ColumnType.TIME);
selectItem = new SelectItem(timeColumn);
c = new FilterItem(selectItem, OperatorType.GREATER_THAN, "02:30:05.000");
@@ -195,6 +201,30 @@ public class FilterItemTest extends TestCase {
row = new DefaultRow(header, new Object[] { 1, null });
assertFalse(c.evaluate(row));
+ c = new FilterItem(s1, OperatorType.GREATER_THAN_OR_EQUAL, s2);
+ row = new DefaultRow(header, new Object[] { 5, 1 });
+ assertTrue(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { 1, 5 });
+ assertFalse(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { 5, 5 });
+ assertTrue(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { null, 1 });
+ assertFalse(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { 1, null });
+ assertFalse(c.evaluate(row));
+
+ c = new FilterItem(s1, OperatorType.LESS_THAN_OR_EQUAL, s2);
+ row = new DefaultRow(header, new Object[] { 1, 5 });
+ assertTrue(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { 5, 1 });
+ assertFalse(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { 1, 1 });
+ assertTrue(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { null, 1 });
+ assertFalse(c.evaluate(row));
+ row = new DefaultRow(header, new Object[] { 1, null });
+ assertFalse(c.evaluate(row));
+
c = new FilterItem(s1, OperatorType.EQUALS_TO, s2);
row = new DefaultRow(header, new Object[] { 1, null });
assertFalse(c.evaluate(row));
@@ -247,7 +277,7 @@ public class FilterItemTest extends TestCase {
/**
* Tests that the following (general) rules apply to the object:
- *
+ * <p/>
* <li>the hashcode is the same when run twice on an unaltered object</li>
* <li>if o1.equals(o2) then this condition must be true: o1.hashCode() ==
* 02.hashCode()
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
index 4a89a6e..96e1149 100644
--- a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
+++ b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
@@ -281,6 +281,43 @@ public class CouchDbDataContextTest extends CouchDbTestCase {
assertFalse(ds.next());
ds.close();
+ // Test greater than or equals
+ ds = dc.query().from(getDatabaseName()).select("name").and("age").where("age").greaterThanOrEquals(29)
+ .execute();
+ assertTrue(ds.next());
+ assertEquals("Row[values=[John Doe, 30]]", ds.getRow().toString());
+ assertFalse(ds.next());
+ ds.close();
+
+ ds = dc.query().from(getDatabaseName()).select("name").and("age").where("age").greaterThanOrEquals(30)
+ .execute();
+ assertTrue(ds.next());
+ assertEquals("Row[values=[John Doe, 30]]", ds.getRow().toString());
+ assertFalse(ds.next());
+ ds.close();
+
+ ds = dc.query().from(getDatabaseName()).select("name").and("age").where("age").greaterThanOrEquals(31)
+ .execute();
+ assertFalse(ds.next());
+ ds.close();
+
+ // Test less than or equals
+ ds = dc.query().from(getDatabaseName()).select("name").and("age").where("age").lessThanOrEquals(31).execute();
+ assertTrue(ds.next());
+ assertEquals("Row[values=[John Doe, 30]]", ds.getRow().toString());
+ assertFalse(ds.next());
+ ds.close();
+
+ ds = dc.query().from(getDatabaseName()).select("name").and("age").where("age").lessThanOrEquals(30).execute();
+ assertTrue(ds.next());
+ assertEquals("Row[values=[John Doe, 30]]", ds.getRow().toString());
+ assertFalse(ds.next());
+ ds.close();
+
+ ds = dc.query().from(getDatabaseName()).select("name").and("age").where("age").lessThanOrEquals(29).execute();
+ assertFalse(ds.next());
+ ds.close();
+
// test primary key lookup query
ds = dc.query().from(getDatabaseName()).select("name").and("gender").where("_id").eq(pkValue).execute();
assertTrue(ds.next());
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
index 1746eaa..05ab057 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
@@ -134,20 +134,22 @@ public class JdbcDataContextTest extends JdbcTestCase {
q.from(table, "a");
q.select(table.getColumns());
assertEquals(
- "SELECT a._CUSTOMERNUMBER_, a._CUSTOMERNAME_, a._CONTACTLASTNAME_, a._CONTACTFIRSTNAME_, a._PHONE_, a._ADDRESSLINE1_, a._ADDRESSLINE2_, a._CITY_, a._STATE_, a._POSTALCODE_, a._COUNTRY_, a._SALESREPEMPLOYEENUMBER_, a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a",
- q.toString().replace('\"', '_'));
+ "SELECT a._CUSTOMERNUMBER_, a._CUSTOMERNAME_, a._CONTACTLASTNAME_, a._CONTACTFIRSTNAME_, a._PHONE_, "
+ + "a._ADDRESSLINE1_, a._ADDRESSLINE2_, a._CITY_, a._STATE_, a._POSTALCODE_, a._COUNTRY_, "
+ + "a._SALESREPEMPLOYEENUMBER_, a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a", q.toString()
+ .replace('\"', '_'));
DataSet result = strategy.executeQuery(q);
assertTrue(result.next());
assertEquals(
- "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, 44000, France, 1370, 21000.0]]",
- result.getRow().toString());
+ "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, "
+ + "44000, France, 1370, 21000.0]]", result.getRow().toString());
assertTrue(result.next());
assertTrue(result.next());
assertTrue(result.next());
assertTrue(result.next());
assertEquals(
- "Row[values=[121, Baane Mini Imports, Bergulfsen, Jonas, 07-98 9555, Erling Skakkes gate 78, null, Stavern, null, 4110, Norway, 1504, 81700.0]]",
- result.getRow().toString());
+ "Row[values=[121, Baane Mini Imports, Bergulfsen, Jonas, 07-98 9555, Erling Skakkes gate 78, null, "
+ + "Stavern, null, 4110, Norway, 1504, 81700.0]]", result.getRow().toString());
result.close();
}
@@ -175,14 +177,16 @@ public class JdbcDataContextTest extends JdbcTestCase {
String compliedQueryString = compiledQuery.toSql();
assertEquals(
- "SELECT a._CUSTOMERNUMBER_, a._CUSTOMERNAME_, a._CONTACTLASTNAME_, a._CONTACTFIRSTNAME_, a._PHONE_, a._ADDRESSLINE1_, a._ADDRESSLINE2_, a._CITY_, "
- + "a._STATE_, a._POSTALCODE_, a._COUNTRY_, a._SALESREPEMPLOYEENUMBER_, a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a WHERE a._CUSTOMERNUMBER_ = ? "
+ "SELECT a._CUSTOMERNUMBER_, a._CUSTOMERNAME_, a._CONTACTLASTNAME_, a._CONTACTFIRSTNAME_, a._PHONE_, "
+ + "a._ADDRESSLINE1_, a._ADDRESSLINE2_, a._CITY_, "
+ + "a._STATE_, a._POSTALCODE_, a._COUNTRY_, a._SALESREPEMPLOYEENUMBER_, "
+ + "a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a WHERE a._CUSTOMERNUMBER_ = ? "
+ "AND a._CUSTOMERNAME_ = ?", compliedQueryString.replace('\"', '_'));
DataSet result1 = dataContext.executeQuery(compiledQuery, new Object[] { 103, "Atelier graphique" });
assertTrue(result1.next());
assertEquals(
- "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, 44000, France, 1370, 21000.0]]",
- result1.getRow().toString());
+ "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, "
+ + "44000, France, 1370, 21000.0]]", result1.getRow().toString());
assertFalse(result1.next());
assertEquals(1, jdbcCompiledQuery.getActiveLeases());
@@ -209,6 +213,118 @@ public class JdbcDataContextTest extends JdbcTestCase {
assertEquals(0, jdbcCompiledQuery.getIdleLeases());
}
+ public void testExecuteQueryWithComparisonGreaterThanOrEquals() throws Exception {
+ Connection connection = getTestDbConnection();
+ JdbcDataContext dataContext = new JdbcDataContext(connection,
+ new TableType[] { TableType.TABLE, TableType.VIEW }, null);
+ Schema schema = dataContext.getSchemaByName(dataContext.getDefaultSchemaName());
+
+ QueryParameter queryParameter = new QueryParameter();
+
+ Query q = new Query();
+ Table table = schema.getTables()[0];
+ q.select(new SelectItem("COUNT(*)", null));
+ q.from(table, "a");
+ q.where(table.getColumnByName("CREDITLIMIT"), OperatorType.GREATER_THAN_OR_EQUAL, queryParameter);
+
+ final CompiledQuery compiledQuery = dataContext.compileQuery(q);
+
+ final JdbcCompiledQuery jdbcCompiledQuery = (JdbcCompiledQuery) compiledQuery;
+ assertEquals(0, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(0, jdbcCompiledQuery.getIdleLeases());
+
+ String compliedQueryString = compiledQuery.toSql();
+
+ assertEquals("SELECT COUNT(*) FROM PUBLIC._CUSTOMERS_ a WHERE a._CREDITLIMIT_ >= ?",
+ compliedQueryString.replace('\"', '_'));
+
+ DataSet result1 = dataContext.executeQuery(compiledQuery, new Object[] { 11000 });
+ assertTrue(result1.next());
+ assertEquals("Row[values=[98]]", result1.getRow().toString());
+ assertFalse(result1.next());
+ result1.close();
+
+ result1 = dataContext.executeQuery(compiledQuery, new Object[] { 10999 });
+ assertTrue(result1.next());
+ assertEquals("Row[values=[98]]", result1.getRow().toString());
+ assertFalse(result1.next());
+ result1.close();
+
+ result1 = dataContext.executeQuery(compiledQuery, new Object[] { 11001 });
+ assertTrue(result1.next());
+ assertEquals("Row[values=[97]]", result1.getRow().toString());
+ assertFalse(result1.next());
+
+ assertEquals(1, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(0, jdbcCompiledQuery.getIdleLeases());
+
+ result1.close();
+
+ assertEquals(0, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(1, jdbcCompiledQuery.getIdleLeases());
+
+ compiledQuery.close();
+
+ assertEquals(0, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(0, jdbcCompiledQuery.getIdleLeases());
+ }
+
+ public void testExecuteQueryWithComparisonLessThanOrEquals() throws Exception {
+ Connection connection = getTestDbConnection();
+ JdbcDataContext dataContext = new JdbcDataContext(connection,
+ new TableType[] { TableType.TABLE, TableType.VIEW }, null);
+ Schema schema = dataContext.getSchemaByName(dataContext.getDefaultSchemaName());
+
+ QueryParameter queryParameter = new QueryParameter();
+
+ Query q = new Query();
+ Table table = schema.getTables()[0];
+ q.select(new SelectItem("COUNT(*)", null));
+ q.from(table, "a");
+ q.where(table.getColumnByName("CREDITLIMIT"), OperatorType.LESS_THAN_OR_EQUAL, queryParameter);
+
+ final CompiledQuery compiledQuery = dataContext.compileQuery(q);
+
+ final JdbcCompiledQuery jdbcCompiledQuery = (JdbcCompiledQuery) compiledQuery;
+ assertEquals(0, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(0, jdbcCompiledQuery.getIdleLeases());
+
+ String compliedQueryString = compiledQuery.toSql();
+
+ assertEquals("SELECT COUNT(*) FROM PUBLIC._CUSTOMERS_ a WHERE a._CREDITLIMIT_ <= ?",
+ compliedQueryString.replace('\"', '_'));
+
+ DataSet result1 = dataContext.executeQuery(compiledQuery, new Object[] { 11000 });
+ assertTrue(result1.next());
+ assertEquals("Row[values=[25]]", result1.getRow().toString());
+ assertFalse(result1.next());
+ result1.close();
+
+ result1 = dataContext.executeQuery(compiledQuery, new Object[] { 11001 });
+ assertTrue(result1.next());
+ assertEquals("Row[values=[25]]", result1.getRow().toString());
+ assertFalse(result1.next());
+ result1.close();
+
+ result1 = dataContext.executeQuery(compiledQuery, new Object[] { 10999 });
+ assertTrue(result1.next());
+ assertEquals("Row[values=[24]]", result1.getRow().toString());
+ assertFalse(result1.next());
+
+ assertEquals(1, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(0, jdbcCompiledQuery.getIdleLeases());
+
+ result1.close();
+
+ assertEquals(0, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(1, jdbcCompiledQuery.getIdleLeases());
+
+ compiledQuery.close();
+
+ assertEquals(0, jdbcCompiledQuery.getActiveLeases());
+ assertEquals(0, jdbcCompiledQuery.getIdleLeases());
+ }
+
public void testGetSchemaNormalTableTypes() throws Exception {
Connection connection = getTestDbConnection();
JdbcDataContext dc = new JdbcDataContext(connection, new TableType[] { TableType.TABLE, TableType.VIEW }, null);
@@ -233,8 +349,10 @@ public class JdbcDataContextTest extends JdbcTestCase {
assertEquals(
"[Column[name=CUSTOMERNUMBER,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=0], "
+ "Column[name=CUSTOMERNAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
- + "Column[name=CONTACTLASTNAME,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
- + "Column[name=CONTACTFIRSTNAME,columnNumber=3,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ + "Column[name=CONTACTLASTNAME,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,"
+ + "columnSize=50], "
+ + "Column[name=CONTACTFIRSTNAME,columnNumber=3,type=VARCHAR,nullable=false,nativeType=VARCHAR,"
+ + "columnSize=50], "
+ "Column[name=PHONE,columnNumber=4,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ "Column[name=ADDRESSLINE1,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ "Column[name=ADDRESSLINE2,columnNumber=6,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=50], "
@@ -242,7 +360,8 @@ public class JdbcDataContextTest extends JdbcTestCase {
+ "Column[name=STATE,columnNumber=8,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=50], "
+ "Column[name=POSTALCODE,columnNumber=9,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=15], "
+ "Column[name=COUNTRY,columnNumber=10,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
- + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,columnSize=0], "
+ + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,"
+ + "columnSize=0], "
+ "Column[name=CREDITLIMIT,columnNumber=12,type=NUMERIC,nullable=true,nativeType=NUMERIC,columnSize=17]]",
Arrays.toString(columns));
connection.close();
@@ -258,9 +377,8 @@ public class JdbcDataContextTest extends JdbcTestCase {
/**
* TODO: A single constraint now exists, create more ...
*/
- assertEquals(
- "[Relationship[primaryTable=PRODUCTS,primaryColumns=[PRODUCTCODE],foreignTable=ORDERFACT,foreignColumns=[PRODUCTCODE]]]",
- Arrays.toString(relations));
+ assertEquals("[Relationship[primaryTable=PRODUCTS,primaryColumns=[PRODUCTCODE],foreignTable=ORDERFACT,"
+ + "foreignColumns=[PRODUCTCODE]]]", Arrays.toString(relations));
Column[] indexedColumns = productsTable.getIndexedColumns();
assertEquals(
@@ -298,10 +416,14 @@ public class JdbcDataContextTest extends JdbcTestCase {
EasyMock.expect(
mockStatement
- .executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a"))
- .andReturn(
- realStatement
- .executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a"));
+ .executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", "
+ + "a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", "
+ + "a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", "
+ + "a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a")).andReturn(
+ realStatement.executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", "
+ + "a.\"CONTACTFIRSTNAME\", a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", "
+ + "a.\"STATE\", a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", "
+ + "a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a"));
mockStatement.close();
@@ -315,14 +437,15 @@ public class JdbcDataContextTest extends JdbcTestCase {
Table table = schema.getTables()[0];
q.from(table, "a");
q.select(table.getColumns());
- assertEquals(
- "SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a",
+ assertEquals("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", "
+ + "a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", a.\"POSTALCODE\", "
+ + "a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a",
q.toString());
DataSet result = dc.executeQuery(q);
assertTrue(result.next());
assertEquals(
- "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, 44000, France, 1370, 21000.0]]",
- result.getRow().toString());
+ "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, "
+ + "44000, France, 1370, 21000.0]]", result.getRow().toString());
assertTrue(result.next());
assertTrue(result.next());
assertFalse(result.next());
@@ -351,8 +474,6 @@ public class JdbcDataContextTest extends JdbcTestCase {
/**
* Executes the same query on two diffent strategies, one with database-side
* query execution and one with Query postprocessing
- *
- * @throws Exception
*/
public void testCsvQueryResultComparison() throws Exception {
Connection connection = getTestDbConnection();
@@ -383,8 +504,10 @@ public class JdbcDataContextTest extends JdbcTestCase {
assertEquals(
"[Column[name=CUSTOMERNUMBER,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=0], "
+ "Column[name=CUSTOMERNAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
- + "Column[name=CONTACTLASTNAME,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
- + "Column[name=CONTACTFIRSTNAME,columnNumber=3,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ + "Column[name=CONTACTLASTNAME,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,"
+ + "columnSize=50], "
+ + "Column[name=CONTACTFIRSTNAME,columnNumber=3,type=VARCHAR,nullable=false,nativeType=VARCHAR,"
+ + "columnSize=50], "
+ "Column[name=PHONE,columnNumber=4,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ "Column[name=ADDRESSLINE1,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ "Column[name=ADDRESSLINE2,columnNumber=6,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=50], "
@@ -392,7 +515,8 @@ public class JdbcDataContextTest extends JdbcTestCase {
+ "Column[name=STATE,columnNumber=8,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=50], "
+ "Column[name=POSTALCODE,columnNumber=9,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=15], "
+ "Column[name=COUNTRY,columnNumber=10,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
- + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,columnSize=0], "
+ + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,"
+ + "columnSize=0], "
+ "Column[name=CREDITLIMIT,columnNumber=12,type=NUMERIC,nullable=true,nativeType=NUMERIC,columnSize=17]]",
Arrays.toString(customersTable.getColumns()));
assertEquals(
@@ -421,9 +545,9 @@ public class JdbcDataContextTest extends JdbcTestCase {
q.where(new FilterItem(new SelectItem(employeeNumberColumn1), OperatorType.EQUALS_TO, new SelectItem(
employeeNumberColumn2)));
- assertEquals(
- "SELECT c.\"COUNTRY\", SUM(c.\"CREDITLIMIT\") FROM PUBLIC.\"CUSTOMERS\" c, PUBLIC.\"EMPLOYEES\" o WHERE c.\"SALESREPEMPLOYEENUMBER\" = o.\"EMPLOYEENUMBER\" GROUP BY c.\"COUNTRY\" ORDER BY c.\"COUNTRY\" ASC",
- q.toString());
+ assertEquals("SELECT c.\"COUNTRY\", SUM(c.\"CREDITLIMIT\") FROM PUBLIC.\"CUSTOMERS\" c, "
+ + "PUBLIC.\"EMPLOYEES\" o WHERE c.\"SALESREPEMPLOYEENUMBER\" = o.\"EMPLOYEENUMBER\" GROUP BY c"
+ + ".\"COUNTRY\" ORDER BY c.\"COUNTRY\" ASC", q.toString());
DataSet data1 = dataContext1.executeQuery(q);
assertTrue(data1.next());
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java
----------------------------------------------------------------------
diff --git a/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java b/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java
index fb8c8a8..008dde9 100644
--- a/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java
+++ b/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java
@@ -64,13 +64,11 @@ import com.mongodb.WriteConcern;
/**
* DataContext implementation for MongoDB.
- *
+ *
* Since MongoDB has no schema, a virtual schema will be used in this
* DataContext. This implementation supports either automatic discovery of a
* schema or manual specification of a schema, through the
* {@link MongoDbTableDef} class.
- *
- * @author Kasper Sørensen
*/
public class MongoDbDataContext extends QueryPostprocessDataContext implements UpdateableDataContext {
@@ -83,10 +81,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Constructor available for backwards compatibility
- *
- * @param mongoDb
- * @param tableDefs
- *
+ *
* @deprecated use {@link #MongoDbDataContext(DB, SimpleTableDef...)}
* instead
*/
@@ -99,7 +94,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
* Constructs a {@link MongoDbDataContext}. This constructor accepts a
* custom array of {@link MongoDbTableDef}s which allows the user to define
* his own view on the collections in the database.
- *
+ *
* @param mongoDb
* the mongo db connection
* @param tableDefs
@@ -117,7 +112,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Constructs a {@link MongoDbDataContext} and automatically detects the
* schema structure/view on all collections (see {@link #detectSchema(DB)}).
- *
+ *
* @param mongoDb
* the mongo db connection
*/
@@ -129,13 +124,12 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
* Performs an analysis of the available collections in a Mongo {@link DB}
* instance and tries to detect the table's structure based on the first
* 1000 documents in each collection.
- *
- * @see #detectTable(DB, String)
- *
+ *
* @param db
* the mongo db to inspect
* @return a mutable schema instance, useful for further fine tuning by the
* user.
+ * @see #detectTable(DB, String)
*/
public static SimpleTableDef[] detectSchema(DB db) {
Set<String> collectionNames = db.getCollectionNames();
@@ -153,7 +147,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
* Performs an analysis of an available collection in a Mongo {@link DB}
* instance and tries to detect the table structure based on the first 1000
* documents in the collection.
- *
+ *
* @param db
* the mongo DB
* @param collectionName
@@ -247,7 +241,8 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
}
@Override
- protected Row executePrimaryKeyLookupQuery(Table table, List<SelectItem> selectItems, Column primaryKeyColumn, Object keyValue) {
+ protected Row executePrimaryKeyLookupQuery(Table table, List<SelectItem> selectItems, Column primaryKeyColumn,
+ Object keyValue) {
final DBCollection collection = _mongoDb.getCollection(table.getName());
List<FilterItem> whereItems = new ArrayList<FilterItem>();
@@ -315,7 +310,8 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
final Object operand = whereItem.getOperand();
final Row row = executePrimaryKeyLookupQuery(table, selectItems, column, operand);
if (row == null) {
- logger.debug("DataContext did not return any primary key lookup query results. Proceeding with manual lookup.");
+ logger.debug("DataContext did not return any primary key lookup query results. Proceeding "
+ + "with manual lookup.");
} else {
final DataSetHeader header = new SimpleDataSetHeader(selectItems);
return new InMemoryDataSet(header, row);
@@ -418,9 +414,15 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
case LESS_THAN:
operatorName = "$lt";
break;
+ case LESS_THAN_OR_EQUAL:
+ operatorName = "$lte";
+ break;
case GREATER_THAN:
operatorName = "$gt";
break;
+ case GREATER_THAN_OR_EQUAL:
+ operatorName = "$gte";
+ break;
case DIFFERENT_FROM:
operatorName = "$ne";
break;
@@ -445,9 +447,6 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Executes an update with a specific {@link WriteConcernAdvisor}.
- *
- * @param update
- * @param writeConcernAdvisor
*/
public void executeUpdate(UpdateScript update, WriteConcernAdvisor writeConcernAdvisor) {
MongoDbUpdateCallback callback = new MongoDbUpdateCallback(this, writeConcernAdvisor);
@@ -460,9 +459,6 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Executes an update with a specific {@link WriteConcern}.
- *
- * @param update
- * @param writeConcern
*/
public void executeUpdate(UpdateScript update, WriteConcern writeConcern) {
executeUpdate(update, new SimpleWriteConcernAdvisor(writeConcern));
@@ -476,8 +472,6 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Gets the {@link WriteConcernAdvisor} to use on
* {@link #executeUpdate(UpdateScript)} calls.
- *
- * @return
*/
public WriteConcernAdvisor getWriteConcernAdvisor() {
if (_writeConcernAdvisor == null) {
@@ -489,8 +483,6 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Sets a global {@link WriteConcern} advisor to use on
* {@link #executeUpdate(UpdateScript)}.
- *
- * @param writeConcernAdvisor
*/
public void setWriteConcernAdvisor(WriteConcernAdvisor writeConcernAdvisor) {
_writeConcernAdvisor = writeConcernAdvisor;
@@ -498,8 +490,6 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
/**
* Gets the {@link DB} instance that this {@link DataContext} is backed by.
- *
- * @return
*/
public DB getMongoDb() {
return _mongoDb;
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
index b539160..60d64fd 100644
--- a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
+++ b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
@@ -148,7 +148,8 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
// Instantiate the actual data context
final DataContext dataContext = new MongoDbDataContext(db);
- assertEquals("[" + getCollectionName() + ", system.indexes]", Arrays.toString(dataContext.getDefaultSchema().getTableNames()));
+ assertEquals("[" + getCollectionName() + ", system.indexes]",
+ Arrays.toString(dataContext.getDefaultSchema().getTableNames()));
Table table = dataContext.getDefaultSchema().getTableByName(getCollectionName());
assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames()));
@@ -252,6 +253,61 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
ds.close();
}
+ // test GREATER_THAN_OR_EQUAL
+ ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("id")
+ .greaterThanOrEquals(500).and("foo").isEquals("bar").execute();
+ assertEquals(MongoDbDataSet.class, ds.getClass());
+ assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
+
+ try {
+ List<Object[]> objectArrays = ds.toObjectArrays();
+ assertEquals(100, objectArrays.size());
+ assertEquals("[500, record no. 500]", Arrays.toString(objectArrays.get(0)));
+ } finally {
+ ds.close();
+ }
+
+ ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("id")
+ .greaterThanOrEquals(501).and("foo").isEquals("bar").execute();
+ assertEquals(MongoDbDataSet.class, ds.getClass());
+ assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
+
+ try {
+ List<Object[]> objectArrays = ds.toObjectArrays();
+ assertEquals(99, objectArrays.size());
+ assertEquals("[505, record no. 505]", Arrays.toString(objectArrays.get(0)));
+ } finally {
+ ds.close();
+ }
+
+ // test LESS_THAN_OR_EQUAL
+
+ ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("id").lessThanOrEquals(500)
+ .and("foo").isEquals("bar").execute();
+ assertEquals(MongoDbDataSet.class, ds.getClass());
+ assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
+
+ try {
+ List<Object[]> objectArrays = ds.toObjectArrays();
+ assertEquals(101, objectArrays.size());
+ assertEquals("[500, record no. 500]", Arrays.toString(objectArrays.get(100)));
+ } finally {
+ ds.close();
+ }
+
+ ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("id").lessThanOrEquals(499)
+ .and("foo").isEquals("bar").execute();
+ assertEquals(MongoDbDataSet.class, ds.getClass());
+ assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
+
+ try {
+ List<Object[]> objectArrays = ds.toObjectArrays();
+ assertEquals(100, objectArrays.size());
+ assertEquals("[495, record no. 495]", Arrays.toString(objectArrays.get(99)));
+ } finally {
+ ds.close();
+ }
+
// test a primary key lookup query
BasicDBObject dbRow = new BasicDBObject();
dbRow.put("_id", 123456);
@@ -273,8 +329,9 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
assertFalse(ds.next());
// do a query that we cannot push to mongo
+ // Replace column index 0 by 1
ds = dataContext.query().from(getCollectionName())
- .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables()[0].getColumnByName("id"))
+ .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables()[1].getColumnByName("id"))
.where("foo").isEquals("bar").execute();
assertEquals(InMemoryDataSet.class, ds.getClass());
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/41185dfc/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f1ce241..83f46ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -345,9 +345,10 @@
<exclude>**/.settings/**</exclude>
<exclude>**/.travis.yml</exclude>
<exclude>**/target/**</exclude>
- <exclude>**/*.iml/**</exclude>
+ <exclude>**/*.iml/**</exclude>
<exclude>**/*.iws/**</exclude>
<exclude>**/*.ipr/**</exclude>
+ <exclude>**/.idea/**</exclude>
<exclude>DEPENDENCIES</exclude>
<exclude>DISCLAIMER</exclude>
</excludes>