Repository: oozie
Updated Branches:
  refs/heads/master 0d497504e -> 3a6fe570a


OOZIE-2266 Fix 'total' actions returned in coordinator job info (sai-krish via 
rkanter)


Project: http://git-wip-us.apache.org/repos/asf/oozie/repo
Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/3a6fe570
Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/3a6fe570
Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/3a6fe570

Branch: refs/heads/master
Commit: 3a6fe570a2fb1c11fab3c961f25e56e0e91c83ff
Parents: 0d49750
Author: Robert Kanter <[email protected]>
Authored: Mon Jun 22 17:23:26 2015 -0700
Committer: Robert Kanter <[email protected]>
Committed: Mon Jun 22 17:23:26 2015 -0700

----------------------------------------------------------------------
 .../oozie/command/coord/CoordJobXCommand.java   |   2 +-
 .../java/org/apache/oozie/coord/CoordUtils.java |  69 ++++++++++++
 .../CoordActionsCountForJobIdJPAExecutor.java   |  33 +++++-
 .../CoordJobGetActionsSubsetJPAExecutor.java    |  75 +------------
 .../command/coord/TestCoordJobsXCommand.java    |  44 ++++++++
 .../org/apache/oozie/coord/TestCoordUtils.java  |  37 +++++++
 ...estCoordActionsCountForJobIdJPAExecutor.java | 106 +++++++++++++++++++
 release-log.txt                                 |   1 +
 8 files changed, 293 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/main/java/org/apache/oozie/command/coord/CoordJobXCommand.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/command/coord/CoordJobXCommand.java 
b/core/src/main/java/org/apache/oozie/command/coord/CoordJobXCommand.java
index 51b09a2..fcc86a8 100644
--- a/core/src/main/java/org/apache/oozie/command/coord/CoordJobXCommand.java
+++ b/core/src/main/java/org/apache/oozie/command/coord/CoordJobXCommand.java
@@ -129,7 +129,7 @@ public class CoordJobXCommand extends 
CoordinatorXCommand<CoordinatorJobBean> {
             if (jpaService != null) {
                 coordJob = jpaService.execute(new CoordJobGetJPAExecutor(id));
                 if (getActionInfo) {
-                    int numAction = jpaService.execute(new 
CoordActionsCountForJobIdJPAExecutor(id));
+                    int numAction = jpaService.execute(new 
CoordActionsCountForJobIdJPAExecutor(id, filterMap));
                     List<CoordinatorActionBean> coordActions = null;
                     if (len == 0) {
                         coordActions = new ArrayList<CoordinatorActionBean>();

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/CoordUtils.java 
b/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
index 7f05ef5..94c6974 100644
--- a/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
+++ b/core/src/main/java/org/apache/oozie/coord/CoordUtils.java
@@ -25,11 +25,14 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.Map;
+import java.util.HashMap;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.oozie.CoordinatorActionBean;
+import org.apache.oozie.CoordinatorEngine;
 import org.apache.oozie.ErrorCode;
 import org.apache.oozie.XException;
 import org.apache.oozie.client.OozieClient;
@@ -45,12 +48,14 @@ import org.apache.oozie.service.XLogService;
 import org.apache.oozie.sla.SLAOperations;
 import org.apache.oozie.util.CoordActionsInDateRange;
 import org.apache.oozie.util.DateUtils;
+import org.apache.oozie.util.Pair;
 import org.apache.oozie.util.ParamChecker;
 import org.apache.oozie.util.XLog;
 import org.jdom.Element;
 
 import com.google.common.annotations.VisibleForTesting;
 
+
 public class CoordUtils {
     public static final String HADOOP_USER = "user.name";
 
@@ -345,4 +350,68 @@ public class CoordUtils {
         return false;
     }
 
+    // Form the where clause to filter by status values
+    public static Map<String, Object> getWhereClause(StringBuilder sb, 
Map<Pair<String, CoordinatorEngine.FILTER_COMPARATORS>,
+            List<Object>> filterMap) {
+        Map<String, Object> params = new HashMap<String, Object>();
+        int pcnt= 1;
+        for (Map.Entry<Pair<String, CoordinatorEngine.FILTER_COMPARATORS>, 
List<Object>> filter : filterMap.entrySet()) {
+            String field = filter.getKey().getFist();
+            CoordinatorEngine.FILTER_COMPARATORS comp = 
filter.getKey().getSecond();
+            String sqlField;
+            if (field.equals(OozieClient.FILTER_STATUS)) {
+                sqlField = "a.statusStr";
+            } else if (field.equals(OozieClient.FILTER_NOMINAL_TIME)) {
+                sqlField = "a.nominalTimestamp";
+            } else {
+                throw new IllegalArgumentException("Invalid filter key " + 
field);
+            }
+
+            sb.append(" and ").append(sqlField).append(" ");
+            switch (comp) {
+                case EQUALS:
+                    sb.append("IN (");
+                    params.putAll(appendParams(sb, filter.getValue(), pcnt));
+                    sb.append(")");
+                    break;
+
+                case NOT_EQUALS:
+                    sb.append("NOT IN (");
+                    params.putAll(appendParams(sb, filter.getValue(), pcnt));
+                    sb.append(")");
+                    break;
+
+                case GREATER:
+                case GREATER_EQUAL:
+                case LESSTHAN:
+                case LESSTHAN_EQUAL:
+                    if (filter.getValue().size() != 1) {
+                        throw new IllegalArgumentException(field + 
comp.getSign() + " can't have more than 1 values");
+                    }
+
+                    sb.append(comp.getSign()).append(" ");
+                    params.putAll(appendParams(sb, filter.getValue(), pcnt));
+                    break;
+            }
+
+            pcnt += filter.getValue().size();
+        }
+        sb.append(" ");
+        return params;
+    }
+
+    private static Map<String, Object> appendParams(StringBuilder sb, 
List<Object> value, int sindex) {
+        Map<String, Object> params = new HashMap<String, Object>();
+        boolean first = true;
+        for (Object val : value) {
+            String pname = "p" + sindex++;
+            params.put(pname, val);
+            if (!first) {
+                sb.append(", ");
+            }
+            sb.append(':').append(pname);
+            first = false;
+        }
+        return params;
+    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionsCountForJobIdJPAExecutor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionsCountForJobIdJPAExecutor.java
 
b/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionsCountForJobIdJPAExecutor.java
index 997b153..f49848f 100644
--- 
a/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionsCountForJobIdJPAExecutor.java
+++ 
b/core/src/main/java/org/apache/oozie/executor/jpa/CoordActionsCountForJobIdJPAExecutor.java
@@ -21,19 +21,27 @@ package org.apache.oozie.executor.jpa;
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
+import org.apache.oozie.coord.CoordUtils;
+import org.apache.oozie.CoordinatorEngine.FILTER_COMPARATORS;
 import org.apache.oozie.ErrorCode;
+import org.apache.oozie.util.Pair;
 import org.apache.oozie.util.ParamChecker;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * Load the number of running actions for a coordinator job.
  */
 public class CoordActionsCountForJobIdJPAExecutor implements 
JPAExecutor<Integer> {
 
     private String coordJobId = null;
+    private Map<Pair<String, FILTER_COMPARATORS>, List<Object>> filterMap;
 
-    public CoordActionsCountForJobIdJPAExecutor(String coordJobId) {
+    public CoordActionsCountForJobIdJPAExecutor(String coordJobId, 
Map<Pair<String, FILTER_COMPARATORS>, List<Object>> filterMap) {
         ParamChecker.notNull(coordJobId, "coordJobId");
         this.coordJobId = coordJobId;
+        this.filterMap = filterMap;
     }
 
     @Override
@@ -45,7 +53,7 @@ public class CoordActionsCountForJobIdJPAExecutor implements 
JPAExecutor<Integer
     public Integer execute(EntityManager em) throws JPAExecutorException {
         try {
             Query q = em.createNamedQuery("GET_COORD_ACTIONS_COUNT_BY_JOBID");
-            q.setParameter("jobId", coordJobId);
+            q = setQueryParameters(q, em);
             Long count = (Long) q.getSingleResult();
             return Integer.valueOf(count.intValue());
         }
@@ -54,4 +62,25 @@ public class CoordActionsCountForJobIdJPAExecutor implements 
JPAExecutor<Integer
         }
     }
 
+    private Query setQueryParameters(Query q, EntityManager em){
+        Map<String, Object> params = null;
+        if (filterMap != null) {
+            // Add the filter clause
+            String query = q.toString();
+            StringBuilder sbTotal = new StringBuilder(query);
+            // Get the 'where' clause for status filters
+            StringBuilder statusClause = new StringBuilder();
+            params = CoordUtils.getWhereClause(statusClause, filterMap);
+            sbTotal.insert(sbTotal.length(), statusClause);
+            q = em.createQuery(sbTotal.toString());
+        }
+        if (params != null) {
+            for (String pname : params.keySet()) {
+                q.setParameter(pname, params.get(pname));
+            }
+        }
+        q.setParameter("jobId", coordJobId);
+        return q;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/main/java/org/apache/oozie/executor/jpa/CoordJobGetActionsSubsetJPAExecutor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/executor/jpa/CoordJobGetActionsSubsetJPAExecutor.java
 
b/core/src/main/java/org/apache/oozie/executor/jpa/CoordJobGetActionsSubsetJPAExecutor.java
index ffe91ec..9db9daa 100644
--- 
a/core/src/main/java/org/apache/oozie/executor/jpa/CoordJobGetActionsSubsetJPAExecutor.java
+++ 
b/core/src/main/java/org/apache/oozie/executor/jpa/CoordJobGetActionsSubsetJPAExecutor.java
@@ -18,12 +18,12 @@
 
 package org.apache.oozie.executor.jpa;
 
+import org.apache.oozie.coord.CoordUtils;
 import org.apache.oozie.CoordinatorActionBean;
 import org.apache.oozie.CoordinatorEngine.FILTER_COMPARATORS;
 import org.apache.oozie.ErrorCode;
 import org.apache.oozie.StringBlob;
 import org.apache.oozie.client.CoordinatorAction;
-import org.apache.oozie.client.OozieClient;
 import org.apache.oozie.service.Services;
 import org.apache.oozie.util.DateUtils;
 import org.apache.oozie.util.Pair;
@@ -33,10 +33,8 @@ import javax.persistence.EntityManager;
 import javax.persistence.Query;
 import java.sql.Timestamp;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 
 /**
  * Load coordinator actions by offset and len (a subset) for a coordinator job.
@@ -54,8 +52,8 @@ public class CoordJobGetActionsSubsetJPAExecutor implements 
JPAExecutor<List<Coo
         this.coordJobId = coordJobId;
     }
 
-    public CoordJobGetActionsSubsetJPAExecutor(String coordJobId, 
Map<Pair<String, FILTER_COMPARATORS>, List<Object>> filterMap,
-            int offset, int len, boolean desc) {
+    public CoordJobGetActionsSubsetJPAExecutor(String coordJobId, 
Map<Pair<String, FILTER_COMPARATORS>,
+            List<Object>> filterMap, int offset, int len, boolean desc) {
         this(coordJobId);
         this.filterMap = filterMap;
         this.offset = offset;
@@ -104,7 +102,7 @@ public class CoordJobGetActionsSubsetJPAExecutor implements 
JPAExecutor<List<Coo
             int offset = query.lastIndexOf("order");
             // Get the 'where' clause for status filters
             StringBuilder statusClause = new StringBuilder();
-            params = getWhereClause(statusClause, filterMap);
+            params = CoordUtils.getWhereClause(statusClause, filterMap);
             // Insert 'where' before 'order by'
             sbTotal.insert(offset, statusClause);
             q = em.createQuery(sbTotal.toString());
@@ -123,71 +121,6 @@ public class CoordJobGetActionsSubsetJPAExecutor 
implements JPAExecutor<List<Coo
         return q;
     }
 
-    // Form the where clause to filter by status values
-    private Map<String, Object> getWhereClause(StringBuilder sb, 
Map<Pair<String, FILTER_COMPARATORS>,
-        List<Object>> filterMap) {
-        Map<String, Object> params = new HashMap<String, Object>();
-        int pcnt= 1;
-        for (Entry<Pair<String, FILTER_COMPARATORS>, List<Object>> filter : 
filterMap.entrySet()) {
-            String field = filter.getKey().getFist();
-            FILTER_COMPARATORS comp = filter.getKey().getSecond();
-            String sqlField;
-            if (field.equals(OozieClient.FILTER_STATUS)) {
-                sqlField = "a.statusStr";
-            } else if (field.equals(OozieClient.FILTER_NOMINAL_TIME)) {
-                sqlField = "a.nominalTimestamp";
-            } else {
-                throw new IllegalArgumentException("Invalid filter key " + 
field);
-            }
-
-            sb.append(" and ").append(sqlField).append(" ");
-            switch (comp) {
-            case EQUALS:
-                sb.append("IN (");
-                params.putAll(appendParams(sb, filter.getValue(), pcnt));
-                sb.append(")");
-                break;
-
-            case NOT_EQUALS:
-                sb.append("NOT IN (");
-                params.putAll(appendParams(sb, filter.getValue(), pcnt));
-                sb.append(")");
-                break;
-
-            case GREATER:
-            case GREATER_EQUAL:
-            case LESSTHAN:
-            case LESSTHAN_EQUAL:
-                if (filter.getValue().size() != 1) {
-                    throw new IllegalArgumentException(field + comp.getSign() 
+ " can't have more than 1 values");
-                }
-
-                sb.append(comp.getSign()).append(" ");
-                params.putAll(appendParams(sb, filter.getValue(), pcnt));
-                break;
-            }
-
-            pcnt += filter.getValue().size();
-        }
-        sb.append(" ");
-        return params;
-    }
-
-    private Map<String, Object> appendParams(StringBuilder sb, List<Object> 
value, int sindex) {
-        Map<String, Object> params = new HashMap<String, Object>();
-        boolean first = true;
-        for (Object val : value) {
-            String pname = "p" + sindex++;
-            params.put(pname, val);
-            if (!first) {
-                sb.append(", ");
-            }
-            sb.append(':').append(pname);
-            first = false;
-        }
-        return params;
-    }
-
     private CoordinatorActionBean getBeanForRunningCoordAction(Object arr[]) {
         CoordinatorActionBean bean = new CoordinatorActionBean();
         if (arr[0] != null) {

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/test/java/org/apache/oozie/command/coord/TestCoordJobsXCommand.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/oozie/command/coord/TestCoordJobsXCommand.java 
b/core/src/test/java/org/apache/oozie/command/coord/TestCoordJobsXCommand.java
index df86bc7..212cbbd 100644
--- 
a/core/src/test/java/org/apache/oozie/command/coord/TestCoordJobsXCommand.java
+++ 
b/core/src/test/java/org/apache/oozie/command/coord/TestCoordJobsXCommand.java
@@ -57,6 +57,10 @@ public class TestCoordJobsXCommand extends XDataTestCase {
         _testGetJobsForAppName();
         _testGetJobInfoForUser();
         _testGetJobsForUserAndStatus();
+        addRecordToCoordJobTable(CoordinatorJob.Status.RUNNING, false, false);
+        addRecordToCoordJobTable(CoordinatorJob.Status.RUNNING, false, false);
+        addRecordToCoordJobTable(CoordinatorJob.Status.RUNNING, false, false);
+        _testGetJobCount();
     }
 
     private void _testGetJobsForStatus() throws Exception {
@@ -123,4 +127,44 @@ public class TestCoordJobsXCommand extends XDataTestCase {
         assertEquals(ret.getCoordJobs().size(), 2);
     }
 
+    private void _testGetJobCount() throws Exception {
+
+        // With no Filter and different offset/len
+        Map<String, List<String>> filter = new HashMap<String, List<String>>();
+        CoordJobsXCommand coordsGetCmd = new CoordJobsXCommand(filter, 1, 1);
+        CoordinatorJobInfo ret = coordsGetCmd.call();
+        assertNotNull(ret);
+        assertEquals(ret.getTotal(), 6);
+
+        coordsGetCmd = new CoordJobsXCommand(filter, 3, 6);
+        ret = coordsGetCmd.call();
+        assertNotNull(ret);
+        assertEquals(ret.getTotal(), 6);
+
+        coordsGetCmd = new CoordJobsXCommand(filter, 5, 20);
+        ret = coordsGetCmd.call();
+        assertNotNull(ret);
+        assertEquals(ret.getTotal(), 6);
+
+        // With User and status
+        List<String> list1 = new ArrayList<String>();
+        list1.add(getTestUser());
+        filter.put(OozieClient.FILTER_USER, list1);
+
+        List<String> list2 = new ArrayList<String>();
+        list2.add("RUNNING");
+        filter.put(OozieClient.FILTER_STATUS, list2);
+
+        coordsGetCmd = new CoordJobsXCommand(filter, 1, 20);
+        ret = coordsGetCmd.call();
+        assertNotNull(ret);
+        assertEquals(ret.getTotal(), 4);
+
+        coordsGetCmd = new CoordJobsXCommand(filter, 2, 1);
+        ret = coordsGetCmd.call();
+        assertNotNull(ret);
+        assertEquals(ret.getTotal(), 4);
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/test/java/org/apache/oozie/coord/TestCoordUtils.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/coord/TestCoordUtils.java 
b/core/src/test/java/org/apache/oozie/coord/TestCoordUtils.java
index ae3f18d..56b16c3 100644
--- a/core/src/test/java/org/apache/oozie/coord/TestCoordUtils.java
+++ b/core/src/test/java/org/apache/oozie/coord/TestCoordUtils.java
@@ -19,14 +19,25 @@
 
 package org.apache.oozie.coord;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+
 import org.apache.oozie.CoordinatorActionBean;
+import org.apache.oozie.CoordinatorEngine;
 import org.apache.oozie.CoordinatorJobBean;
 import org.apache.oozie.client.CoordinatorAction;
 import org.apache.oozie.client.CoordinatorJob;
+import org.apache.oozie.client.OozieClient;
 import org.apache.oozie.local.LocalOozie;
+import org.apache.oozie.service.JPAService;
 import org.apache.oozie.service.Services;
 import org.apache.oozie.test.XDataTestCase;
+import org.apache.oozie.util.Pair;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
 
 public class TestCoordUtils extends  XDataTestCase{
     private Services services;
@@ -103,4 +114,30 @@ public class TestCoordUtils extends  XDataTestCase{
 
         assertEquals(2, coordActions.size());
     }
+
+    public void testGetWhereClause() throws Exception{
+        Map<Pair<String, CoordinatorEngine.FILTER_COMPARATORS>, List<Object>>
+                filterMap = new HashMap<Pair<String, 
CoordinatorEngine.FILTER_COMPARATORS>, List<Object>>();
+        final Pair<String, CoordinatorEngine.FILTER_COMPARATORS> STATUS_FILTER 
=
+                Pair.of(OozieClient.FILTER_STATUS, 
CoordinatorEngine.FILTER_COMPARATORS.EQUALS);
+        List<Object> positiveFilter = new ArrayList<Object>();
+        positiveFilter.add("RUNNING");
+        positiveFilter.add("KILLED");
+        filterMap.put(STATUS_FILTER, positiveFilter);
+
+        JPAService jpaService = Services.get().get(JPAService.class);
+        EntityManager em = jpaService.getEntityManager();
+
+        Query q = em.createNamedQuery("GET_COORD_ACTIONS_COUNT_BY_JOBID");
+        String query = q.toString();
+        StringBuilder sbTotal = new StringBuilder(query);
+        // Get the 'where' clause for status filters
+        StringBuilder statusClause = new StringBuilder();
+        Map<String, Object> params = CoordUtils.getWhereClause(statusClause, 
filterMap);
+        sbTotal.insert(sbTotal.length(), statusClause);
+
+        assertTrue(sbTotal.toString().contains("and a.statusStr IN (:p1, 
:p2)"));
+        assertEquals(params.get("p1"), "RUNNING");
+        assertEquals(params.get("p2"), "KILLED");
+    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/core/src/test/java/org/apache/oozie/executor/jpa/TestCoordActionsCountForJobIdJPAExecutor.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/oozie/executor/jpa/TestCoordActionsCountForJobIdJPAExecutor.java
 
b/core/src/test/java/org/apache/oozie/executor/jpa/TestCoordActionsCountForJobIdJPAExecutor.java
new file mode 100644
index 0000000..84a819d
--- /dev/null
+++ 
b/core/src/test/java/org/apache/oozie/executor/jpa/TestCoordActionsCountForJobIdJPAExecutor.java
@@ -0,0 +1,106 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.oozie.executor.jpa;
+
+import org.apache.oozie.CoordinatorActionBean;
+import org.apache.oozie.CoordinatorEngine;
+import org.apache.oozie.CoordinatorJobBean;
+import org.apache.oozie.client.CoordinatorAction;
+import org.apache.oozie.client.CoordinatorJob;
+import org.apache.oozie.client.OozieClient;
+import org.apache.oozie.service.JPAService;
+import org.apache.oozie.service.Services;
+import org.apache.oozie.test.XDataTestCase;
+import org.apache.oozie.util.DateUtils;
+import org.apache.oozie.util.Pair;
+import org.junit.Assert;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+
+public class TestCoordActionsCountForJobIdJPAExecutor extends XDataTestCase {
+    private static final Pair<String, CoordinatorEngine.FILTER_COMPARATORS> 
POSITIVE_STATUS_FILTER =
+            Pair.of(OozieClient.FILTER_STATUS, 
CoordinatorEngine.FILTER_COMPARATORS.EQUALS);
+    private static final Pair<String, CoordinatorEngine.FILTER_COMPARATORS> 
NEGATIVE_STATUS_FILTER =
+            Pair.of(OozieClient.FILTER_STATUS, 
CoordinatorEngine.FILTER_COMPARATORS.NOT_EQUALS);
+    Services services;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        services = new Services();
+        services.init();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        services.destroy();
+        super.tearDown();
+    }
+
+    private Timestamp getSqlTime(String str) throws ParseException {
+        return new Timestamp(DateUtils.parseDateUTC(str).getTime());
+    }
+
+    private List<Object> getList(Object... objs) {
+        List<Object> list = new ArrayList<Object>();
+        for (Object o : objs) {
+            list.add(o);
+        }
+        return list;
+    }
+
+    public void testGetActionsCount() throws Exception {
+        CoordinatorJobBean job = 
addRecordToCoordJobTable(CoordinatorJob.Status.RUNNING, false, false);
+        String timeStr[] = {"2009-02-01T00:00Z", "2009-02-01T05:00Z", 
"2009-02-01T10:00Z", "2009-02-01T15:00Z"};
+        Date ntime[] = {getSqlTime(timeStr[0]), getSqlTime(timeStr[1]), 
getSqlTime(timeStr[2]), getSqlTime(timeStr[3])};
+
+        List<String> actionIds = new ArrayList<String>(timeStr.length);
+        int startAction = 5;
+        for (Date time : ntime) {
+            CoordinatorActionBean action = 
addRecordToCoordActionTable(job.getId(), startAction++,
+                    CoordinatorAction.Status.WAITING, "coord-action-get.xml", 
0, time);
+            actionIds.add(action.getId());
+        }
+        JPAService jpaService = Services.get().get(JPAService.class);
+        assertNotNull(jpaService);
+
+
+        // Without Filters
+        Map<Pair<String, CoordinatorEngine.FILTER_COMPARATORS>, List<Object>> 
filterMap =
+                new HashMap<Pair<String, 
CoordinatorEngine.FILTER_COMPARATORS>, List<Object>>();
+        CoordActionsCountForJobIdJPAExecutor actionGetCountCmd = new 
CoordActionsCountForJobIdJPAExecutor(
+                job.getId(), filterMap);
+        int actionCount = jpaService.execute(actionGetCountCmd);
+        Assert.assertEquals(4, actionCount);
+
+        // With Filter
+        filterMap.put(Pair.of(OozieClient.FILTER_NOMINAL_TIME, 
CoordinatorEngine.FILTER_COMPARATORS.GREATER_EQUAL),
+                getList(ntime[2]));
+        actionGetCountCmd = new 
CoordActionsCountForJobIdJPAExecutor(job.getId(), filterMap);
+        actionCount = jpaService.execute(actionGetCountCmd);
+        Assert.assertEquals(2, actionCount);
+    }
+}

http://git-wip-us.apache.org/repos/asf/oozie/blob/3a6fe570/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index e525c59..227ef42 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 4.3.0 release (trunk - unreleased)
 
+OOZIE-2266 Fix 'total' actions returned in coordinator job info (sai-krish via 
rkanter)
 OOZIE-2264 Fix coord:offset(n,"DAY") to resolve correct data set(kailongs via 
puru)
 OOZIE-2178 fix javadoc to compile on JDK8 (rkanter)
 OOZIE-2268 Update ActiveMQ version for security and other fixes (rkanter)

Reply via email to