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));
- }
}