Author: vanto
Date: Fri May 23 15:45:33 2008
New Revision: 659698

URL: http://svn.apache.org/viewvc?rev=659698&view=rev
Log:
backport of r608610, refers to ODE-89

Modified:
    
ode/branches/APACHE_ODE_1.1/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java

Modified: 
ode/branches/APACHE_ODE_1.1/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.1/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java?rev=659698&r1=659697&r2=659698&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.1/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.1/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
 Fri May 23 15:45:33 2008
@@ -19,7 +19,23 @@
 
 package org.apache.ode.dao.jpa;
 
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.common.BpelEventFilter;
+import org.apache.ode.bpel.common.Filter;
 import org.apache.ode.bpel.common.InstanceFilter;
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.MessageExchangeDAO;
@@ -28,20 +44,17 @@
 import org.apache.ode.bpel.dao.ScopeDAO;
 import org.apache.ode.bpel.evt.BpelEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
-
-import javax.persistence.EntityManager;
-import javax.xml.namespace.QName;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
+import org.apache.ode.utils.ISO8601DateParser;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.OpenJPAQuery;
 
 /**
  * @author Matthieu Riou <mriou at apache dot org>
  */
 public class BPELDAOConnectionImpl implements BpelDAOConnection {
        
+       static final Log __log = LogFactory.getLog(BPELDAOConnectionImpl.class);
+       
        EntityManager _em;
 
     public BPELDAOConnectionImpl(EntityManager em) {
@@ -108,18 +121,69 @@
         eventDao.setEvent(event);
         _em.persist(eventDao);
        }
+    
+    private static String dateFilter(String filter) {
+        String date = Filter.getDateWithoutOp(filter);
+        String op = filter.substring(0,filter.indexOf(date));
+        Date dt = null;
+        try {
+            dt = ISO8601DateParser.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        Timestamp ts = new Timestamp(dt.getTime());
+        return op + " '" + ts.toString() + "'";
+    }
 
        @SuppressWarnings("unchecked")
     public Collection<ProcessInstanceDAO> instanceQuery(InstanceFilter 
criteria) {
         StringBuffer query = new StringBuffer();
         query.append("select pi from ProcessInstanceDAOImpl as pi");
 
-        // TODO Continue implementing me
         if (criteria != null) {
             // Building each clause
             ArrayList<String> clauses = new ArrayList<String>();
+            
+            // pid filter
             if (criteria.getPidFilter() != null)
                 clauses.add(" pi._process._processId = '" + 
criteria.getPidFilter() + "'");
+            
+            // name filter
+            if (criteria.getNameFilter() != null) {
+                String val = criteria.getNameFilter();
+                if (val.endsWith("*")) {
+                    val = val.substring(0, val.length()-1) + "%";
+                }
+                //process type string begins with name space
+                //this could possibly match more than you want
+                //because the name space and name are stored together 
+                clauses.add(" pi._process._processType like '%" + val + "'");
+            }
+            
+            // name space filter
+            if (criteria.getNamespaceFilter() != null) {
+                //process type string begins with name space
+                //this could possibly match more than you want
+                //because the name space and name are stored together
+                clauses.add(" pi._process._processType like '{" + 
+                        criteria.getNamespaceFilter() + "%'");
+            }
+            
+            // started filter
+            if (criteria.getStartedDateFilter() != null) {
+                for ( String ds : criteria.getStartedDateFilter() ) {
+                    clauses.add(" pi._dateCreated " + dateFilter(ds));
+                }
+            }
+            
+            // last-active filter
+            if (criteria.getLastActiveDateFilter() != null) {
+                for ( String ds : criteria.getLastActiveDateFilter() ) {
+                    clauses.add(" pi._lastActive " + dateFilter(ds));
+                }
+            }
+            
+            // status filter
             if (criteria.getStatusFilter() != null) {
                 StringBuffer filters = new StringBuffer();
                 List<Short> states = criteria.convertFilterState();
@@ -129,6 +193,57 @@
                 }
                 clauses.add(" (" + filters.toString() + ")");
             }
+            
+            // $property filter
+            if (criteria.getPropertyValuesFilter() != null) {
+                Map<String,String> props = criteria.getPropertyValuesFilter();
+                // join to correlation sets
+                query.append(" inner join pi._rootScope._correlationSets as 
cs");            
+                int i = 0;
+                for (String propKey : props.keySet()) {
+                    i++;
+                    // join to props for each prop
+                    query.append(" inner join cs._props as csp"+i);
+                    // add clause for prop key and value
+                    clauses.add(" csp"+i+".propertyKey = '"+propKey+
+                            "' and csp"+i+".propertyValue = '"+
+                            // spaces have to be escaped, might be better 
handled in InstanceFilter
+                            props.get(propKey).replaceAll("&#32;", " ")+"'");
+                }
+            }
+            
+            // order by
+            StringBuffer orderby = new StringBuffer("");
+            if (criteria.getOrders() != null) {
+                orderby.append(" order by");
+                List<String> orders = criteria.getOrders();
+                for (int m = 0; m < orders.size(); m++) {
+                    String field = orders.get(m);
+                    String ord = " asc";
+                    if (field.startsWith("-")) {
+                        ord = " desc";
+                    }
+                    String fieldName = " pi._instanceId";
+                    if ( field.endsWith("name") || 
field.endsWith("namespace")) {
+                        fieldName = " pi._process._processType";
+                    }
+                    if ( field.endsWith("version")) {
+                        fieldName = " pi._process._version";
+                    }
+                    if ( field.endsWith("status")) {
+                        fieldName = " pi._state";
+                    }
+                    if ( field.endsWith("started")) {
+                        fieldName = " pi._dateCreated";
+                    }
+                    if ( field.endsWith("last-active")) {
+                        fieldName = " pi._lastActive";
+                    }
+                    orderby.append(fieldName + ord);
+                    if (m < orders.size() - 1) orderby.append(", ");
+                }
+
+            }
 
             // Preparing the statement
             if (clauses.size() > 0) {
@@ -138,8 +253,30 @@
                     if (m < clauses.size() - 1) query.append(" and");
                 }
             }
+            
+            query.append(orderby);
+        }
+        
+        if (__log.isDebugEnabled()) {
+               __log.debug(query.toString());
         }
-        return _em.createQuery(query.toString()).getResultList();
+        
+        // criteria limit
+        Query pq = _em.createQuery(query.toString());
+        OpenJPAQuery kq = OpenJPAPersistence.cast(pq);
+        kq.getFetchPlan().setFetchBatchSize(criteria.getLimit());       
+        List<ProcessInstanceDAO> ql = pq.getResultList();
+       
+        Collection<ProcessInstanceDAO> list = new 
ArrayList<ProcessInstanceDAO>();
+        int num = 0;       
+        for (Iterator iterator = ql.iterator(); iterator.hasNext();) {
+            if(num++ > criteria.getLimit()) break;
+            ProcessInstanceDAO processInstanceDAO = (ProcessInstanceDAO) 
iterator
+                    .next();
+            list.add(processInstanceDAO);            
+        }     
+        
+        return list;
        }
 
    


Reply via email to