You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/12/17 09:15:57 UTC
cayenne git commit: CAY-2499 Support for COUNT(DISTINCT(column))
function aggregate - correct @since version - missing distinct() in parser
Repository: cayenne
Updated Branches:
refs/heads/master 54b3f8110 -> 4724ab3f9
CAY-2499 Support for COUNT(DISTINCT(column)) function aggregate
- correct @since version
- missing distinct() in parser
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/4724ab3f
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/4724ab3f
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/4724ab3f
Branch: refs/heads/master
Commit: 4724ab3f97869620397e8801f97f9b88be8d972d
Parents: 54b3f81
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 13 14:11:51 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 13 14:11:51 2018 +0300
----------------------------------------------------------------------
.../apache/cayenne/exp/FunctionExpressionFactory.java | 1 +
.../main/java/org/apache/cayenne/exp/Property.java | 1 +
.../org/apache/cayenne/exp/parser/ASTDistinct.java | 2 +-
.../apache/cayenne/exp/parser/ExpressionParser.java | 5 ++++-
.../apache/cayenne/exp/parser/ExpressionParser.jjt | 2 +-
.../apache/cayenne/exp/parser/ASTAggregateTest.java | 14 ++++++++++++++
6 files changed, 22 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/4724ab3f/cayenne-server/src/main/java/org/apache/cayenne/exp/FunctionExpressionFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/FunctionExpressionFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/FunctionExpressionFactory.java
index 7c3c980..4818f7b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/FunctionExpressionFactory.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/FunctionExpressionFactory.java
@@ -326,6 +326,7 @@ public class FunctionExpressionFactory {
/**
* @return Expression COUNT(DISTINCT(exp))
+ * @since 4.1
*/
public static Expression countDistinctExp(Expression exp) {
return new ASTCount(new ASTDistinct(exp));
http://git-wip-us.apache.org/repos/asf/cayenne/blob/4724ab3f/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
index 4df67b1..449934c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
@@ -646,6 +646,7 @@ public class Property<E> {
/**
* @see FunctionExpressionFactory#countDistinctExp(Expression)
+ * @since 4.1
*/
public Property<Long> countDistinct() {
return create(FunctionExpressionFactory.countDistinctExp(getExpression()), Long.class);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/4724ab3f/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDistinct.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDistinct.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDistinct.java
index 39088c3..63fed10 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDistinct.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDistinct.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.exp.parser;
import org.apache.cayenne.exp.Expression;
/**
- * @since 4.0
+ * @since 4.1
*/
public class ASTDistinct extends ASTAggregateFunctionCall {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/4724ab3f/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
index cbab144..e644066 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java
@@ -2157,6 +2157,9 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon
case PROPERTY_PATH:
pathExpression();
break;
+ case DISTINCT:
+ distinct();
+ break;
default:
jj_la1[38] = jj_gen;
jj_consume_token(-1);
@@ -2586,7 +2589,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon
jj_la1_0 = new int[] {0x2,0x4,0x18,0x16010018,0x60,0x180,0x10000,0x4fff8,0x4fff8,0x16010000,0x18,0x10000,0x4e000,0x80000,0x16010000,0x0,0x0,0x16010000,0x0,0x100000,0x200000,0x400000,0x1800000,0x1800000,0x6000000,0x6000000,0x8000000,0x8000000,0x16010000,0x2000000,0x6010000,0x10000,0x0,0x80000,0x80000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,};
}
private static void jj_la1_init_1() {
- jj_la1_1 = new int[] {0x0,0x0,0x0,0xfffffdfe,0x0,0x0,0x0,0x0,0x0,0xfffffdfe,0x0,0x0,0x0,0x0,0xfffffdf2,0x7c00,0x7c00,0xfffffdfe,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff8f8000,0x0,0xff8f8000,0xff8f8000,0x7c00,0x0,0x0,0xff8f8000,0x0,0x1f0,0x0,0x700000,0xff800000,0x0,};
+ jj_la1_1 = new int[] {0x0,0x0,0x0,0xfffffdfe,0x0,0x0,0x0,0x0,0x0,0xfffffdfe,0x0,0x0,0x0,0x0,0xfffffdf2,0x7c00,0x7c00,0xfffffdfe,0xc,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff8f8000,0x0,0xff8f8000,0xff8f8000,0x7c00,0x0,0x0,0xff8f8000,0x0,0x1f0,0x200,0x700000,0xff800000,0x0,};
}
private static void jj_la1_init_2() {
jj_la1_2 = new int[] {0x0,0x0,0x0,0xe405f,0x0,0x0,0x2,0x0,0x0,0xe405f,0x0,0x2,0x0,0x0,0xe405f,0x2405c,0x24000,0xe405f,0xe4002,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x20,0xc005f,0x0,0xc005f,0xc005f,0x0,0x0,0x0,0x1,0x0,0x0,0x7c,0x0,0x1,0x5c,};
http://git-wip-us.apache.org/repos/asf/cayenne/blob/4724ab3f/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt b/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
index 8d40e1b..39dddea 100644
--- a/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
+++ b/cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt
@@ -354,7 +354,7 @@ void asterisk() #Asterisk : {}
void count() #Count : { }
{
- <COUNT> "(" ( asterisk() | pathExpression() ) ")"
+ <COUNT> "(" ( asterisk() | pathExpression() | distinct() ) ")"
}
void avg() #Avg : { }
http://git-wip-us.apache.org/repos/asf/cayenne/blob/4724ab3f/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTAggregateTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTAggregateTest.java b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTAggregateTest.java
index f6e57c3..5a832ff 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTAggregateTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTAggregateTest.java
@@ -84,6 +84,20 @@ public class ASTAggregateTest {
}
@Test
+ public void testCountDistinctParse() throws Exception {
+ String expressionString = "count(distinct(artistName))";
+ Expression exp = ExpressionFactory.exp(expressionString);
+ assertTrue(exp instanceof ASTCount);
+ assertEquals(1, exp.getOperandCount());
+ assertTrue(exp.getOperand(0) instanceof ASTDistinct);
+
+ ASTDistinct distinct = (ASTDistinct)exp.getOperand(0);
+ assertTrue(distinct.getOperand(0) instanceof ASTObjPath);
+
+ assertEquals(expressionString, exp.toString());
+ }
+
+ @Test
public void testMinConstruct() throws Exception {
ASTMin min = new ASTMin(null);
assertEquals("MIN", min.getFunctionName());