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>