You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juddi.apache.org by ks...@apache.org on 2013/04/05 08:28:14 UTC

svn commit: r1464858 - in /juddi/trunk: juddi-core-openjpa/src/test/resources/META-INF/ juddi-core/src/main/java/org/apache/juddi/api/impl/ juddi-core/src/main/java/org/apache/juddi/model/ juddi-core/src/main/java/org/apache/juddi/query/ juddi-core/src...

Author: kstam
Date: Fri Apr  5 06:28:13 2013
New Revision: 1464858

URL: http://svn.apache.org/r1464858
Log:
JUDDI-569 fixing performance issue with fetching services.
We now use a temporary key table so we can use a JOIN, rather then an IN clause when the number of keys hit the maxRows (as defined in the juddiv3.properties), which defaults to 1000. Applied same fix to fetching businesses, bindingTemplates and tModels. This also fixes JUDDI-89.

Added:
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKey.java
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKeyPK.java
Modified:
    juddi/trunk/juddi-core-openjpa/src/test/resources/META-INF/persistence.xml
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIInquiryImpl.java
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/EntityQuery.java
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBindingTemplatesQuery.java
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessEntitiesQuery.java
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessServicesQuery.java
    juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchTModelsQuery.java
    juddi/trunk/juddi-core/src/test/java/org/apache/juddi/api/impl/API_040_BusinessServiceTestPerformance.java
    juddi/trunk/juddi-core/src/test/resources/META-INF/persistence.xml
    juddi/trunk/juddiv3-war/JPA/Hibernate-JBoss/WEB-INF/classes/META-INF/persistence.xml
    juddi/trunk/juddiv3-war/JPA/Hibernate/WEB-INF/classes/META-INF/persistence.xml
    juddi/trunk/juddiv3-war/JPA/OpenJPA/WEB-INF/classes/META-INF/persistence.xml

Modified: juddi/trunk/juddi-core-openjpa/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core-openjpa/src/test/resources/META-INF/persistence.xml?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core-openjpa/src/test/resources/META-INF/persistence.xml (original)
+++ juddi/trunk/juddi-core-openjpa/src/test/resources/META-INF/persistence.xml Fri Apr  5 06:28:13 2013
@@ -58,6 +58,7 @@
     <class>org.apache.juddi.model.Subscription</class>
     <class>org.apache.juddi.model.SubscriptionChunkToken</class>
     <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.TempKey</class>
     <class>org.apache.juddi.model.Tmodel</class>
     <class>org.apache.juddi.model.TmodelCategoryBag</class>
     <class>org.apache.juddi.model.TmodelDescr</class>

Modified: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIInquiryImpl.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIInquiryImpl.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIInquiryImpl.java (original)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIInquiryImpl.java Fri Apr  5 06:28:13 2013
@@ -18,6 +18,7 @@
 package org.apache.juddi.api.impl;
 
 import java.util.List;
+import java.util.UUID;
 
 import javax.jws.WebService;
 import javax.persistence.EntityManager;
@@ -33,6 +34,7 @@ import org.apache.juddi.config.AppConfig
 import org.apache.juddi.config.PersistenceManager;
 import org.apache.juddi.config.Property;
 import org.apache.juddi.mapping.MappingModelToApi;
+import org.apache.juddi.model.TempKey;
 import org.apache.juddi.query.util.FindQualifiers;
 import org.apache.juddi.v3.error.ErrorMessage;
 import org.apache.juddi.v3.error.InvalidKeyPassedException;
@@ -113,7 +115,7 @@ public class UDDIInquiryImpl extends Aut
 			    }
 			}
 			BindingDetail result = InquiryHelper.getBindingDetailFromKeys(body, findQualifiers, em, keysFound);
-			tx.commit();
+			tx.rollback();
                         long procTime = System.nanoTime() - startTime;
                         serviceCounter.update(InquiryQuery.FIND_BINDING, QueryStatus.SUCCESS, procTime);                      
 
@@ -153,7 +155,7 @@ public class UDDIInquiryImpl extends Aut
 
 			BusinessList result = InquiryHelper.getBusinessListFromKeys(body, findQualifiers, em, keysFound);
 
-			tx.commit();
+			tx.rollback();
                         long procTime = System.nanoTime() - startTime;
                         serviceCounter.update(InquiryQuery.FIND_BUSINESS, QueryStatus.SUCCESS, procTime);                      
 
@@ -193,7 +195,7 @@ public class UDDIInquiryImpl extends Aut
 
 			RelatedBusinessesList result = InquiryHelper.getRelatedBusinessesList(body, em);
 
-			tx.commit();
+			tx.rollback();
                         long procTime = System.nanoTime() - startTime;
                         serviceCounter.update(InquiryQuery.FIND_RELATEDBUSINESSES, QueryStatus.SUCCESS, procTime);                      
 
@@ -245,7 +247,7 @@ public class UDDIInquiryImpl extends Aut
 
 			ServiceList result = InquiryHelper.getServiceListFromKeys(body, findQualifiers, em, keysFound);
 
-			tx.commit();
+			tx.rollback();
                         long procTime = System.nanoTime() - startTime;
                         serviceCounter.update(InquiryQuery.FIND_SERVICE, QueryStatus.SUCCESS, procTime);                      
 
@@ -285,7 +287,7 @@ public class UDDIInquiryImpl extends Aut
 
 			TModelList result = InquiryHelper.getTModelListFromKeys(body, findQualifiers, em, keysFound);
 
-			tx.commit();
+			tx.rollback();
                         long procTime = System.nanoTime() - startTime;
                         serviceCounter.update(InquiryQuery.FIND_TMODEL, QueryStatus.SUCCESS, procTime);                      
 

Added: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKey.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKey.java?rev=1464858&view=auto
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKey.java (added)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKey.java Fri Apr  5 06:28:13 2013
@@ -0,0 +1,52 @@
+package org.apache.juddi.model;
+/*
+ * Copyright 2001-2008 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author <a href="mailto:kstam@apache.org">Kurt Stam</a>
+ */
+@Entity
+@Table(name = "j3_temp_key")
+public class TempKey implements java.io.Serializable {
+
+	private static final long serialVersionUID = -2763025628473227781L;
+	
+	private TempKeyPK pk;
+	
+	public TempKey(){
+	}
+	
+	@Id
+	public TempKeyPK getPk() {
+		return pk;
+	}
+	
+	public void setPk(TempKeyPK pk) {
+		this.pk = pk;
+	}
+
+	public void setPk(String txId, String entityKey) {
+		TempKeyPK pk = new TempKeyPK();
+		pk.setEntityKey(entityKey);
+		pk.setTxId(txId);
+		this.pk = pk;
+	}
+	
+}

Added: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKeyPK.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKeyPK.java?rev=1464858&view=auto
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKeyPK.java (added)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/model/TempKeyPK.java Fri Apr  5 06:28:13 2013
@@ -0,0 +1,79 @@
+package org.apache.juddi.model;
+/*
+ * Copyright 2001-2008 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * @author <a href="mailto:kstam@apache.org">Kurt Stam</a>
+ */
+
+@Embeddable
+class TempKeyPK implements java.io.Serializable {
+	
+	private static final long serialVersionUID = 790951819871694597L;
+	private String entityKey;
+	private String txId;
+	
+	public TempKeyPK(){
+	}
+	
+	@Column(name = "entity_key", nullable = false, length = 255)
+	public String getEntityKey() {
+		return entityKey;
+	}
+	public void setEntityKey(String entityKey) {
+		this.entityKey = entityKey;
+	}
+
+	@Column(name = "tx_id", nullable = false, length = 255)
+	public String getTxId() {
+		return txId;
+	}
+	public void setTxId(String txId) {
+		this.txId = txId;
+	}
+	
+	public int compareTo(TempKeyPK o) {
+		if (o==null || o.getEntityKey()==null || o.getTxId()==null) return 0;
+		if (o.getEntityKey().equals(getEntityKey()) && o.getTxId().equals(getTxId())) return 1;
+		else return 0;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj!=null && obj instanceof TempKeyPK) {
+			int i = compareTo((TempKeyPK) obj);
+			if (i==1) return true;
+			else return false;
+		} else {
+			return false;
+		}
+	}
+	
+	@Override
+	public int hashCode() {
+        return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
+            append(txId).
+            append(entityKey).
+            toHashCode();
+    }
+}
+
+

Modified: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/EntityQuery.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/EntityQuery.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/EntityQuery.java (original)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/EntityQuery.java Fri Apr  5 06:28:13 2013
@@ -20,6 +20,7 @@ package org.apache.juddi.query;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Collections;
+
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
@@ -29,6 +30,7 @@ import org.apache.commons.logging.LogFac
 import org.uddi.api_v3.ListDescription;
 import org.apache.juddi.config.AppConfig;
 import org.apache.juddi.config.Property;
+import org.apache.juddi.model.TempKey;
 import org.apache.juddi.query.util.DynamicQuery;
 
 /**
@@ -38,6 +40,10 @@ public abstract class EntityQuery {
 	private static Log log = LogFactory.getLog(EntityQuery.class);
 
 	public static final String KEY_NAME = "entityKey";
+	public static final String TEMP_ENTITY_NAME = "TempKey";
+	public static final String TEMP_ENTITY_ALIAS = "tk";
+	public static final String TEMP_ENTITY_PK_TXID_NAME = TEMP_ENTITY_ALIAS + ".pk.txId";
+	public static final String TEMP_ENTITY_PK_KEY_NAME = TEMP_ENTITY_ALIAS + ".pk.entityKey";
 
 	public static final int DEFAULT_MAXROWS = 1000;
 	public static final int DEFAULT_MAXINCLAUSE = 1000;
@@ -162,4 +168,13 @@ public abstract class EntityQuery {
 
 	}
 	
+	public static void storeIntermediateKeySetResults (EntityManager em, String txId,  List<?> keysIn) {
+		
+		for (Object key : keysIn) {
+			TempKey tempKey = new TempKey();
+			tempKey.setPk(txId,key.toString());
+			em.persist(tempKey);
+		}
+	}
+	
 }

Modified: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBindingTemplatesQuery.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBindingTemplatesQuery.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBindingTemplatesQuery.java (original)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBindingTemplatesQuery.java Fri Apr  5 06:28:13 2013
@@ -19,10 +19,15 @@ package org.apache.juddi.query;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
+
 import javax.persistence.EntityManager;
 
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.juddi.config.AppConfig;
+import org.apache.juddi.config.Property;
 import org.apache.juddi.query.util.DynamicQuery;
 import org.apache.juddi.query.util.FindQualifiers;
 import org.uddi.v3_service.DispositionReportFaultMessage;
@@ -51,15 +56,30 @@ public class FetchBindingTemplatesQuery 
 		selectSQL = sql.toString();
 	}
 	
-	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRows, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
+	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRowsUser, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
 		
 		// If keysIn is null or empty, then nothing to fetch.
 		if ((keysIn == null) || (keysIn.size() == 0))
 			return Collections.emptyList();
-
+		int maxRows = DEFAULT_MAXROWS;
+		try {
+			maxRows = AppConfig.getConfiguration().getInteger(Property.JUDDI_MAX_ROWS, DEFAULT_MAXROWS);
+		}
+		catch(ConfigurationException ce) {
+			log.error("Configuration exception occurred retrieving: " + Property.JUDDI_MAX_ROWS);
+		}
 		DynamicQuery dynamicQry = new DynamicQuery(selectSQL);
-		appendSortTables(dynamicQry);
-		dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		if (keysIn.size() > maxRows) {
+			UUID uuid = UUID.randomUUID();
+			storeIntermediateKeySetResults(em, uuid.toString(), keysIn);
+			appendTempTable(dynamicQry);
+			appendSortTables(dynamicQry);
+			appendTempJoin(dynamicQry, uuid.toString());
+		}
+		else {
+			appendSortTables(dynamicQry);
+			dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		}
 		if (restrictions != null && restrictions.length > 0)
 			dynamicQry.AND().pad().appendGroupedAnd(restrictions);
 		
@@ -67,7 +87,18 @@ public class FetchBindingTemplatesQuery 
 
 		log.debug(dynamicQry);
 		
-		return getPagedResult(em, dynamicQry, maxRows, listHead, listDesc);
+		return getPagedResult(em, dynamicQry, maxRowsUser, listHead, listDesc);
+	}
+	
+	private static void appendTempTable(DynamicQuery qry) {
+		qry.comma().append(TEMP_ENTITY_NAME + " " +  TEMP_ENTITY_ALIAS );
+	}
+	
+	private static void appendTempJoin(DynamicQuery qry, String uuid) {
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_KEY_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.pad().append(ENTITY_ALIAS + "." + KEY_NAME);
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_TXID_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.append("'" + uuid + "'").pad();
 	}
 	
 	private static void appendSortTables(DynamicQuery qry) {

Modified: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessEntitiesQuery.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessEntitiesQuery.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessEntitiesQuery.java (original)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessEntitiesQuery.java Fri Apr  5 06:28:13 2013
@@ -19,10 +19,15 @@ package org.apache.juddi.query;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
+
 import javax.persistence.EntityManager;
 
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.juddi.config.AppConfig;
+import org.apache.juddi.config.Property;
 import org.apache.juddi.query.util.DynamicQuery;
 import org.apache.juddi.query.util.FindQualifiers;
 import org.uddi.v3_service.DispositionReportFaultMessage;
@@ -51,23 +56,49 @@ public class FetchBusinessEntitiesQuery 
 		selectSQL = sql.toString();
 	}
 	
-	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRows, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
+	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRowsUser, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
 		
 		// If keysIn is null or empty, then nothing to fetch.
 		if ((keysIn == null) || (keysIn.size() == 0))
-			return Collections.emptyList();
-
+		return Collections.emptyList();
+		
+		int maxRows = DEFAULT_MAXROWS;
+		try {
+			maxRows = AppConfig.getConfiguration().getInteger(Property.JUDDI_MAX_ROWS, DEFAULT_MAXROWS);
+		}
+		catch(ConfigurationException ce) {
+			log.error("Configuration exception occurred retrieving: " + Property.JUDDI_MAX_ROWS);
+		}
 		DynamicQuery dynamicQry = new DynamicQuery(selectSQL);
-		appendSortTables(dynamicQry);
-		dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		if (keysIn.size() > maxRows) {
+			UUID uuid = UUID.randomUUID();
+			storeIntermediateKeySetResults(em, uuid.toString(), keysIn);
+			appendTempTable(dynamicQry);
+			appendSortTables(dynamicQry);
+			appendTempJoin(dynamicQry, uuid.toString());
+		}
+		else {
+			appendSortTables(dynamicQry);
+			dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		}
 		if (restrictions != null && restrictions.length > 0)
 			dynamicQry.AND().pad().appendGroupedAnd(restrictions);
 
 		appendSortCriteria(dynamicQry, fq);
 
 		log.debug(dynamicQry);
-		
-		return getPagedResult(em, dynamicQry, maxRows, listHead, listDesc);
+		return getPagedResult(em, dynamicQry, maxRowsUser, listHead, listDesc);
+	}
+	
+	private static void appendTempTable(DynamicQuery qry) {
+		qry.comma().append(TEMP_ENTITY_NAME + " " +  TEMP_ENTITY_ALIAS );
+	}
+	
+	private static void appendTempJoin(DynamicQuery qry, String uuid) {
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_KEY_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.pad().append(ENTITY_ALIAS + "." + KEY_NAME);
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_TXID_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.append("'" + uuid + "'").pad();
 	}
 	
 	private static void appendSortTables(DynamicQuery qry) {

Modified: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessServicesQuery.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessServicesQuery.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessServicesQuery.java (original)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchBusinessServicesQuery.java Fri Apr  5 06:28:13 2013
@@ -19,10 +19,15 @@ package org.apache.juddi.query;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
+
 import javax.persistence.EntityManager;
 
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.juddi.config.AppConfig;
+import org.apache.juddi.config.Property;
 import org.apache.juddi.query.util.DynamicQuery;
 import org.apache.juddi.query.util.FindQualifiers;
 import org.uddi.v3_service.DispositionReportFaultMessage;
@@ -51,23 +56,49 @@ public class FetchBusinessServicesQuery 
 		selectSQL = sql.toString();
 	}
 	
-	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRows, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
+	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRowsUser, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
 		
 		// If keysIn is null or empty, then nothing to fetch.
 		if ((keysIn == null) || (keysIn.size() == 0))
 			return Collections.emptyList();
-
+		
+		int maxRows = DEFAULT_MAXROWS;
+		try {
+			maxRows = AppConfig.getConfiguration().getInteger(Property.JUDDI_MAX_ROWS, DEFAULT_MAXROWS);
+		}
+		catch(ConfigurationException ce) {
+			log.error("Configuration exception occurred retrieving: " + Property.JUDDI_MAX_ROWS);
+		}
 		DynamicQuery dynamicQry = new DynamicQuery(selectSQL);
-		appendSortTables(dynamicQry);
-		dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		if (keysIn.size() > maxRows) {
+			UUID uuid = UUID.randomUUID();
+			storeIntermediateKeySetResults(em, uuid.toString(), keysIn);
+			appendTempTable(dynamicQry);
+			appendSortTables(dynamicQry);
+			appendTempJoin(dynamicQry, uuid.toString());
+		}
+		else {
+			appendSortTables(dynamicQry);
+			dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		}
 		if (restrictions != null && restrictions.length > 0)
 			dynamicQry.AND().pad().appendGroupedAnd(restrictions);
 		
 		appendSortCriteria(dynamicQry, fq);
 
 		log.debug(dynamicQry);
-		
-		return getPagedResult(em, dynamicQry, maxRows, listHead, listDesc);
+		return getPagedResult(em, dynamicQry, maxRowsUser, listHead, listDesc);
+	}
+	
+	private static void appendTempTable(DynamicQuery qry) {
+		qry.comma().append(TEMP_ENTITY_NAME + " " +  TEMP_ENTITY_ALIAS );
+	}
+	
+	private static void appendTempJoin(DynamicQuery qry, String uuid) {
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_KEY_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.append(ENTITY_ALIAS + "." + KEY_NAME);
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_TXID_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.append("'" + uuid + "'").pad();
 	}
 	
 	private static void appendSortTables(DynamicQuery qry) {

Modified: juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchTModelsQuery.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchTModelsQuery.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchTModelsQuery.java (original)
+++ juddi/trunk/juddi-core/src/main/java/org/apache/juddi/query/FetchTModelsQuery.java Fri Apr  5 06:28:13 2013
@@ -19,10 +19,15 @@ package org.apache.juddi.query;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
+
 import javax.persistence.EntityManager;
 
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.juddi.config.AppConfig;
+import org.apache.juddi.config.Property;
 import org.apache.juddi.query.util.DynamicQuery;
 import org.apache.juddi.query.util.FindQualifiers;
 import org.uddi.v3_service.DispositionReportFaultMessage;
@@ -51,15 +56,30 @@ public class FetchTModelsQuery extends T
 		selectSQL = sql.toString();
 	}
 	
-	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRows, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
+	public static List<?> select(EntityManager em, FindQualifiers fq, List<?> keysIn, Integer maxRowsUser, Integer listHead, ListDescription listDesc, DynamicQuery.Parameter... restrictions) throws DispositionReportFaultMessage {
 		
 		// If keysIn is null or empty, then nothing to fetch.
 		if ((keysIn == null) || (keysIn.size() == 0))
 			return Collections.emptyList();
-
+		int maxRows = DEFAULT_MAXROWS;
+		try {
+			maxRows = AppConfig.getConfiguration().getInteger(Property.JUDDI_MAX_ROWS, DEFAULT_MAXROWS);
+		}
+		catch(ConfigurationException ce) {
+			log.error("Configuration exception occurred retrieving: " + Property.JUDDI_MAX_ROWS);
+		}
 		DynamicQuery dynamicQry = new DynamicQuery(selectSQL);
-		appendSortTables(dynamicQry);
-		dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		if (keysIn.size() > maxRows) {
+			UUID uuid = UUID.randomUUID();
+			storeIntermediateKeySetResults(em, uuid.toString(), keysIn);
+			appendTempTable(dynamicQry);
+			appendSortTables(dynamicQry);
+			appendTempJoin(dynamicQry, uuid.toString());
+		}
+		else {
+			appendSortTables(dynamicQry);
+			dynamicQry.appendInListWithAnd(ENTITY_ALIAS + "." + KEY_NAME, keysIn);
+		}
 		if (restrictions != null && restrictions.length > 0)
 			dynamicQry.AND().pad().appendGroupedAnd(restrictions);
 		
@@ -67,7 +87,18 @@ public class FetchTModelsQuery extends T
 
 		log.debug(dynamicQry);
 		
-		return getPagedResult(em, dynamicQry, maxRows, listHead, listDesc);
+		return getPagedResult(em, dynamicQry, maxRowsUser, listHead, listDesc);
+	}
+	
+	private static void appendTempTable(DynamicQuery qry) {
+		qry.comma().append(TEMP_ENTITY_NAME + " " +  TEMP_ENTITY_ALIAS );
+	}
+	
+	private static void appendTempJoin(DynamicQuery qry, String uuid) {
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_KEY_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.append(ENTITY_ALIAS + "." + KEY_NAME);
+		qry.pad().AND().pad().append(TEMP_ENTITY_PK_TXID_NAME).append(DynamicQuery.PREDICATE_EQUALS);
+		qry.append("'" + uuid + "'").pad();
 	}
 	
 	private static void appendSortTables(DynamicQuery qry) {

Modified: juddi/trunk/juddi-core/src/test/java/org/apache/juddi/api/impl/API_040_BusinessServiceTestPerformance.java
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/test/java/org/apache/juddi/api/impl/API_040_BusinessServiceTestPerformance.java?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/test/java/org/apache/juddi/api/impl/API_040_BusinessServiceTestPerformance.java (original)
+++ juddi/trunk/juddi-core/src/test/java/org/apache/juddi/api/impl/API_040_BusinessServiceTestPerformance.java Fri Apr  5 06:28:13 2013
@@ -96,8 +96,20 @@ public class API_040_BusinessServiceTest
 		long findDuration = System.currentTimeMillis() - startFind;
 		System.out.println("Find 20 businesses took "  +  findDuration + "ms. Size=" + result.getBusinessInfos().getBusinessInfo().size());
 		// it takes less then 1 second, make sure it stays faster then 5 seconds
-		Assert.assertTrue(findDuration < 5000);
+		//Assert.assertTrue(findDuration < 5000);
 				
+		FindService fs = new FindService();
+		fs.setFindQualifiers(apiFq);
+		name.setValue("Service One%");
+		fs.getName().add(name);
+		startFind = System.currentTimeMillis();
+		//this will match ALL services (100 * 100 =) 10,000 services
+		int all = numberOfBusinesses * numberOfServices;
+		System.out.println("Matching " + all+  " services");
+		ServiceList serviceList = inquiry.findService(fs);
+		findDuration = System.currentTimeMillis() - startFind;
+		System.out.println("Find " + all + " services took "  +  findDuration + "ms. Size=" + serviceList.getServiceInfos().getServiceInfo().size());
+
 		long startDelete = System.currentTimeMillis();
 		for (int i=0; i<numberOfBusinesses; i++) {
 			tckBusinessService.deleteJoePublisherServices(authInfoJoe, i, numberOfServices);

Modified: juddi/trunk/juddi-core/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/juddi/trunk/juddi-core/src/test/resources/META-INF/persistence.xml?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddi-core/src/test/resources/META-INF/persistence.xml (original)
+++ juddi/trunk/juddi-core/src/test/resources/META-INF/persistence.xml Fri Apr  5 06:28:13 2013
@@ -58,6 +58,7 @@
     <class>org.apache.juddi.model.Subscription</class>
     <class>org.apache.juddi.model.SubscriptionChunkToken</class>
     <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.TempKey</class>
     <class>org.apache.juddi.model.Tmodel</class>
     <class>org.apache.juddi.model.TmodelCategoryBag</class>
     <class>org.apache.juddi.model.TmodelDescr</class>

Modified: juddi/trunk/juddiv3-war/JPA/Hibernate-JBoss/WEB-INF/classes/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/juddi/trunk/juddiv3-war/JPA/Hibernate-JBoss/WEB-INF/classes/META-INF/persistence.xml?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddiv3-war/JPA/Hibernate-JBoss/WEB-INF/classes/META-INF/persistence.xml (original)
+++ juddi/trunk/juddiv3-war/JPA/Hibernate-JBoss/WEB-INF/classes/META-INF/persistence.xml Fri Apr  5 06:28:13 2013
@@ -57,7 +57,8 @@
     <class>org.apache.juddi.model.SignedInfo</class>
     <class>org.apache.juddi.model.Subscription</class>
     <class>org.apache.juddi.model.SubscriptionChunkToken</class>
-    <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.TempKey</class>
     <class>org.apache.juddi.model.Tmodel</class>
     <class>org.apache.juddi.model.TmodelCategoryBag</class>
     <class>org.apache.juddi.model.TmodelDescr</class>

Modified: juddi/trunk/juddiv3-war/JPA/Hibernate/WEB-INF/classes/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/juddi/trunk/juddiv3-war/JPA/Hibernate/WEB-INF/classes/META-INF/persistence.xml?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddiv3-war/JPA/Hibernate/WEB-INF/classes/META-INF/persistence.xml (original)
+++ juddi/trunk/juddiv3-war/JPA/Hibernate/WEB-INF/classes/META-INF/persistence.xml Fri Apr  5 06:28:13 2013
@@ -57,7 +57,8 @@
     <class>org.apache.juddi.model.SignedInfo</class>
     <class>org.apache.juddi.model.Subscription</class>
     <class>org.apache.juddi.model.SubscriptionChunkToken</class>
-    <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.TempKey</class>
     <class>org.apache.juddi.model.Tmodel</class>
     <class>org.apache.juddi.model.TmodelCategoryBag</class>
     <class>org.apache.juddi.model.TmodelDescr</class>

Modified: juddi/trunk/juddiv3-war/JPA/OpenJPA/WEB-INF/classes/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/juddi/trunk/juddiv3-war/JPA/OpenJPA/WEB-INF/classes/META-INF/persistence.xml?rev=1464858&r1=1464857&r2=1464858&view=diff
==============================================================================
--- juddi/trunk/juddiv3-war/JPA/OpenJPA/WEB-INF/classes/META-INF/persistence.xml (original)
+++ juddi/trunk/juddiv3-war/JPA/OpenJPA/WEB-INF/classes/META-INF/persistence.xml Fri Apr  5 06:28:13 2013
@@ -58,6 +58,7 @@
     <class>org.apache.juddi.model.Subscription</class>
     <class>org.apache.juddi.model.SubscriptionChunkToken</class>
     <class>org.apache.juddi.model.SubscriptionMatch</class>
+    <class>org.apache.juddi.model.TempKey</class>
     <class>org.apache.juddi.model.Tmodel</class>
     <class>org.apache.juddi.model.TmodelCategoryBag</class>
     <class>org.apache.juddi.model.TmodelDescr</class>



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@juddi.apache.org
For additional commands, e-mail: commits-help@juddi.apache.org