METAMODEL-204: Fixed
Fixes #66
diff --git a/core/src/main/java/org/apache/metamodel/query/SelectItem.java b/core/src/main/java/org/apache/metamodel/query/SelectItem.java
index 287d1a6..a1e33de 100644
--- a/core/src/main/java/org/apache/metamodel/query/SelectItem.java
+++ b/core/src/main/java/org/apache/metamodel/query/SelectItem.java
@@ -48,7 +48,7 @@
public class SelectItem extends BaseObject implements QueryItem, Cloneable {
public static final String FUNCTION_APPROXIMATION_PREFIX = "APPROXIMATE ";
-
+
private static final long serialVersionUID = 317475105509663973L;
private static final Logger logger = LoggerFactory.getLogger(SelectItem.class);
@@ -526,6 +526,18 @@
}
/**
+ * Creates a copy of the {@link SelectItem}, with a different
+ * {@link #isFunctionApproximationAllowed()} flag set.
+ *
+ * @param functionApproximationAllowed
+ * @return
+ */
+ public SelectItem replaceFunctionApproximationAllowed(boolean functionApproximationAllowed) {
+ return new SelectItem(_column, _fromItem, _function, _expression, _subQuerySelectItem, _alias,
+ functionApproximationAllowed);
+ }
+
+ /**
* Investigates whether or not this SelectItem references a particular
* column. This will search for direct references and indirect references
* via subqueries.
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
index cf8cfd8..f4f50aa 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
@@ -280,6 +280,12 @@
}
protected String rewriteSelectItem(Query query, SelectItem item) {
+ if (item.isFunctionApproximationAllowed()) {
+ // function approximation is not included in any standard SQL
+ // constructions - will have to be overridden by subclasses if there
+ // are specialized dialects for it.
+ item = item.replaceFunctionApproximationAllowed(false);
+ }
return item.toSql(isSchemaIncludedInColumnPaths());
}
}
\ No newline at end of file
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
index db969c4..12d5fe2 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
@@ -72,6 +72,14 @@
_connection.close();
}
+ public void testApproximateCount() throws Exception {
+ final JdbcDataContext dataContext = new JdbcDataContext(_connection);
+ final DataSet dataSet = dataContext.executeQuery("SELECT APPROXIMATE COUNT(*) FROM customers");
+ assertTrue(dataSet.next());
+ assertEquals(122, dataSet.getRow().getValue(0));
+ assertFalse(dataSet.next());
+ }
+
public void testTimestampValueInsertSelect() throws Exception {
Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:" + getName(), USERNAME, PASSWORD);
JdbcTestTemplates.timestampValueInsertSelect(connection, TimeUnit.NANOSECONDS);