Author: lindner
Date: Fri Jan 23 09:17:37 2009
New Revision: 737099

URL: http://svn.apache.org/viewvc?rev=737099&view=rev
Log:
SHINDIG-885 | patch from Chico Charlesworth | Incorrect totalResults 
calculation in PersonServiceDb and ActivityDb

Modified:
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
    
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDbTest.java
    
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulJsonPeopleTest.java
    
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulXmlPeopleTest.java

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java?rev=737099&r1=737098&r2=737099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
 Fri Jan 23 09:17:37 2009
@@ -17,6 +17,7 @@
  */
 package org.apache.shindig.social.opensocial.jpa.spi;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 import org.apache.shindig.auth.SecurityToken;
@@ -175,6 +176,18 @@
       throw new SocialSpiException(ResponseError.BAD_REQUEST, "Group ID not 
recognized");
 
     }
+    
+    // Get total results, that is count the total number of rows for this query
+    Long totalResults = JPQLUtils.getTotalResults(entityManager, 
sb.toString(), paramList);
+    
+    // Execute paginated query
+    if (totalResults > 0) {
+      plist = JPQLUtils.getListQuery(entityManager, sb.toString(), paramList, 
options);
+    }
+
+    if (plist == null) {
+      plist = Lists.newArrayList();
+    }
 
     plist = JPQLUtils.getListQuery(entityManager, sb.toString(), paramList, 
null);
 
@@ -184,7 +197,7 @@
 
     // all of the above could equally have been placed into a thread to 
overlay the
     // db wait times.
-    return ImmediateFuture.newInstance(new RestfulCollection<Activity>(plist));
+    return ImmediateFuture.newInstance(new RestfulCollection<Activity>(plist, 
options.getFirst(), totalResults.intValue()));
   }
   
   /* (non-Javadoc)

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java?rev=737099&r1=737098&r2=737099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
 Fri Jan 23 09:17:37 2009
@@ -17,7 +17,9 @@
  */
 package org.apache.shindig.social.opensocial.jpa.spi;
 
+import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.opensocial.spi.CollectionOptions;
+import org.apache.shindig.social.opensocial.spi.SocialSpiException;
 
 import java.util.List;
 
@@ -62,17 +64,60 @@
   @SuppressWarnings("unchecked")
   public static <T> List<T> getListQuery(EntityManager entityManager, String 
query,
       List<?> parametersValues, CollectionOptions collectionOptions) {
+    Query q = createQuery(entityManager, query, parametersValues);
+    if (collectionOptions != null) {
+      q.setFirstResult(collectionOptions.getFirst());
+      q.setMaxResults(collectionOptions.getMax());
+    }
+    return (List<T>) q.getResultList();
+  }
+  
+  
+  /**
+   * Performs a 'select count(*)' on the given query
+   * 
+   * @param entityManager
+   * @param query
+   * @param parametersValues
+   * @return
+   */
+  @SuppressWarnings("unchecked")
+  public static Long getTotalResults(EntityManager entityManager, String query,
+      List<?> parametersValues) {
+    int fromIndex = 0;
+    String queryInUpperCase = query.toUpperCase();
+    // If JPA query starts with FROM then fromIndex as 0 is correct,
+    // otherwise find where FROM keyword starts in the query string and set 
the fromIndex.
+    if (!queryInUpperCase.startsWith("FROM ")) {
+      fromIndex = queryInUpperCase.indexOf(" FROM ");
+      if (fromIndex == -1) {
+        // Couldn't find the FROM keyword in the query
+        throw new SocialSpiException(ResponseError.INTERNAL_ERROR, "Invalid 
query [" + query + "]");
+      }
+    }
+    query = "select count(*) " + query.substring(fromIndex, query.length());
+    System.out.println("Count query [" + query + "]");
+    Query q = createQuery(entityManager, query, parametersValues);
+    return (Long) q.getSingleResult();
+  }
+
+  /**
+   * Create JPA Query
+   * 
+   * @param entityManager
+   * @param query
+   * @param parametersValues
+   * @return
+   */
+  private static Query createQuery(EntityManager entityManager, String query,
+      List<?> parametersValues) {
     Query q = entityManager.createQuery(query);
     int i = 1;
     for (Object p : parametersValues) {
       q.setParameter(i, p);
       i++;
     }
-    if (collectionOptions != null) {
-      q.setFirstResult(collectionOptions.getFirst());
-      q.setMaxResults(collectionOptions.getMax());
-    }
-    return (List<T>) q.getResultList();
+    return q;
   }
 
 }

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java?rev=737099&r1=737098&r2=737099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
 Fri Jan 23 09:17:37 2009
@@ -122,9 +122,15 @@
     if (filterPos > 0) {
       paramList.add(collectionOptions.getFilterValue());
     }
-    addOrderClause(sb, collectionOptions);
-
-    plist = JPQLUtils.getListQuery(entiyManager, sb.toString(), paramList, 
collectionOptions);
+    
+    // Get total results, that is count the total number of rows for this query
+    Long totalResults = JPQLUtils.getTotalResults(entiyManager, sb.toString(), 
paramList);
+    
+    // Execute ordered and paginated query
+    if (totalResults > 0) {
+      addOrderClause(sb, collectionOptions);
+      plist = JPQLUtils.getListQuery(entiyManager, sb.toString(), paramList, 
collectionOptions);
+    }
 
     if (plist == null) {
       plist = Lists.newArrayList();
@@ -132,7 +138,7 @@
 
     // all of the above could equally have been placed into a thread to 
overlay the
     // db wait times.
-    return ImmediateFuture.newInstance(new RestfulCollection<Person>(plist, 
collectionOptions.getFirst(), plist.size()));
+    return ImmediateFuture.newInstance(new RestfulCollection<Person>(plist, 
collectionOptions.getFirst(), totalResults.intValue()));
 
   }
 

Modified: 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDbTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDbTest.java?rev=737099&r1=737098&r2=737099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDbTest.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDbTest.java
 Fri Jan 23 09:17:37 2009
@@ -105,7 +105,7 @@
     // Get first friend of john.doe
     Future<RestfulCollection<Person>> result = 
this.personServiceDb.getPeople(SpiTestUtil.buildUserIds("john.doe"), new 
GroupId(GroupId.Type.friends, "@friends"), collectionOptions, 
Person.Field.ALL_FIELDS, SpiTestUtil.DEFAULT_TEST_SECURITY_TOKEN);    
     RestfulCollection<Person> peopleCollection = result.get();
-    assertEquals(1, peopleCollection.getTotalResults());
+    assertEquals(3, peopleCollection.getTotalResults());
     assertEquals(0, peopleCollection.getStartIndex());    
     List<Person> people = peopleCollection.getEntry();    
     SpiTestUtil.assertPersonEquals(people.get(0), "george.doe", "George Doe");
@@ -114,7 +114,7 @@
     collectionOptions.setFirst(1);
     result = 
this.personServiceDb.getPeople(SpiTestUtil.buildUserIds("john.doe"), new 
GroupId(GroupId.Type.friends, "@friends"), collectionOptions, 
Person.Field.ALL_FIELDS, SpiTestUtil.DEFAULT_TEST_SECURITY_TOKEN);
     peopleCollection = result.get();
-    assertEquals(1, peopleCollection.getTotalResults());
+    assertEquals(3, peopleCollection.getTotalResults());
     assertEquals(1, peopleCollection.getStartIndex());    
     people = peopleCollection.getEntry();    
     SpiTestUtil.assertPersonEquals(people.get(0), "jane.doe", "Jane Doe");    

Modified: 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulJsonPeopleTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulJsonPeopleTest.java?rev=737099&r1=737098&r2=737099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulJsonPeopleTest.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulJsonPeopleTest.java
 Fri Jan 23 09:17:37 2009
@@ -21,13 +21,6 @@
 import org.apache.shindig.social.dataservice.integration.RestfulJsonPeopleTest;
 import org.apache.shindig.social.opensocial.jpa.spi.SpiDatabaseBootstrap;
 
-import java.util.Map;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.junit.Test;
-
-import com.google.common.collect.Maps;
 import com.google.inject.Injector;
 
 /**
@@ -66,57 +59,6 @@
   protected void tearDown() throws Exception {
     super.tearDown();
     this.bootstrap.tearDown();
-  }
-       
-  /**
-   * TODO Overriding this test because of an existing jira issue
-   * (https://issues.apache.org/jira/browse/SHINDIG-778)
-   * where totalResults should be the same as specified in the count parameter.
-   * Remove once issue 778 has been fixed.
-   */
-       @Test
-  public void testGetPeoplePagination() throws Exception {
-    Map<String, String> extraParams = Maps.newHashMap();
-    extraParams.put("sortBy", "name");
-    extraParams.put("sortOrder", null);
-    extraParams.put("filterBy", null);
-    extraParams.put("startIndex", "0");
-    extraParams.put("count", "1");
-    extraParams.put("fields", null);
-
-    String resp = getResponse("/people/john.doe/@friends", "GET", extraParams, 
null, "application/json");
-    JSONObject result = getJson(resp);
-
-    assertEquals(1, result.getInt("totalResults"));
-    assertEquals(0, result.getInt("startIndex"));
-
-    JSONArray people = result.getJSONArray("entry");
-    assertPerson(people.getJSONObject(0), "george.doe", "George Doe");
-
-    // Get the second page
-    extraParams.put("startIndex", "1");
-    resp = getResponse("/people/john.doe/@friends", "GET", extraParams, null, 
"application/json");
-    result = getJson(resp);
-
-    assertEquals(1, result.getInt("totalResults"));
-    assertEquals(1, result.getInt("startIndex"));
-
-    people = result.getJSONArray("entry");
-    assertPerson(people.getJSONObject(0), "jane.doe", "Jane Doe");
-  }
-
-       /**
-        * Convenience assert method
-        * 
-        * @param person
-        * @param expectedId
-        * @param expectedName
-        * @throws Exception
-        */
-  private void assertPerson(JSONObject person, String expectedId, String 
expectedName)
-      throws Exception {
-    assertEquals(expectedId, person.getString("id"));
-    assertEquals(expectedName, 
person.getJSONObject("name").getString("formatted"));
-  }
+  }    
   
 }

Modified: 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulXmlPeopleTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulXmlPeopleTest.java?rev=737099&r1=737098&r2=737099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulXmlPeopleTest.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/spi/integration/JpaRestfulXmlPeopleTest.java
 Fri Jan 23 09:17:37 2009
@@ -20,22 +20,7 @@
 
 import org.apache.shindig.social.dataservice.integration.RestfulXmlPeopleTest;
 import org.apache.shindig.social.opensocial.jpa.spi.SpiDatabaseBootstrap;
-import org.apache.shindig.social.opensocial.util.XSDValidator;
 
-import java.io.StringReader;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathFactory;
-
-import org.junit.Test;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-import com.google.common.collect.Maps;
 import com.google.inject.Injector;
 
 /**
@@ -44,9 +29,6 @@
  */
 public class JpaRestfulXmlPeopleTest extends RestfulXmlPeopleTest {
   
-  // TODO Remove once jira issue 778 (see below) has been fixed.
-  private XPathFactory xpathFactory = XPathFactory.newInstance();
-  
   /** The bootstrap. */
   private SpiDatabaseBootstrap bootstrap;
   
@@ -78,86 +60,5 @@
     super.tearDown();
     this.bootstrap.tearDown();
   }
-  
-  @Test
-  public void testGetPersonJson() throws Exception {
-    
-  }
-  
-  @Test
-  public void testGetPeople() throws Exception {
-    
-  }
-       
-  /**
-   * TODO Overriding this test because of an existing jira issue
-   * (https://issues.apache.org/jira/browse/SHINDIG-778)
-   * where totalResults should be the same as specified in the count parameter.
-   * Remove once issue 778 has been fixed.
-   */
-       @Test
-  public void testGetPeoplePagination() throws Exception {
-         Map<String, String> extraParams = Maps.newHashMap();
-    extraParams.put("sortBy", "name");
-    extraParams.put("sortOrder", null);
-    extraParams.put("filterBy", null);
-    extraParams.put("startIndex", "0");
-    extraParams.put("count", "1");
-    extraParams.put("fields", null);
-
-    String resp = getResponse("/people/john.doe/@friends", "GET", extraParams,
-        "xml", "application/xml");
-
-    XSDValidator.validate(resp, XMLSCHEMA, XSDRESOURCE,false);
-
-    XPath xp = xpathFactory.newXPath();
-    NodeList resultNodeList = (NodeList) xp.evaluate("/response",
-        new InputSource(new StringReader(resp)), XPathConstants.NODESET);
-    assertEquals(1, resultNodeList.getLength());
-
-    Map<String, List<String>> result = childNodesToMap(resultNodeList.item(0));
-    Map<String, List<Node>> resultNodes = childNodesToNodeMap(resultNodeList
-        .item(0));
-
-    assertEquals("1", result.get("totalResults").get(0));
-    assertEquals("0", result.get("startIndex").get(0));
-
-    Map<String, List<Node>> entryOne = 
childNodesToNodeMap(resultNodes.get("entry").get(0));
-    
-    assertPerson(childNodesToNodeMap(entryOne.get("person").get(0)),
-        "george.doe", "George Doe");
-
-    // Get the second page
-    extraParams.put("startIndex", "1");
-    resp = getResponse("/people/john.doe/@friends", "GET", extraParams, "xml",
-        "application/xml");
-    
-    XSDValidator.validate(resp, XMLSCHEMA, XSDRESOURCE,false);
-
-    xp = xpathFactory.newXPath();
-    resultNodeList = (NodeList) xp.evaluate("/response", new InputSource(
-        new StringReader(resp)), XPathConstants.NODESET);
-    assertEquals(1, resultNodeList.getLength());
-
-    result = childNodesToMap(resultNodeList.item(0));
-    resultNodes = childNodesToNodeMap(resultNodeList.item(0));
-
-    assertEquals("1", result.get("totalResults").get(0));
-    assertEquals("1", result.get("startIndex").get(0));
-
-    Map<String, List<Node>> entryTwo = 
childNodesToNodeMap(resultNodes.get("entry").get(0));
-    assertPerson(childNodesToNodeMap(entryTwo.get("person").get(0)),
-        "jane.doe", "Jane Doe");
-  }
-       
-       /**
-        * TODO Remove once jira issue 778 (see above) has been fixed.
-        */
-       private void assertPerson(Map<String, List<Node>> person, String 
expectedId,
-      String expectedName) throws Exception {
-    assertEquals(expectedId, person.get("id").get(0).getTextContent());
-    assertEquals(expectedName, childNodesToMap(person.get("name").get(0)).get(
-        "formatted").get(0));
-  }
 
 }


Reply via email to