You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by pn...@apache.org on 2004/09/09 10:06:15 UTC
cvs commit: jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search XQueryExecuter.java
pnever 2004/09/09 01:06:15
Modified: proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search
Tag: TWS421_BRANCH XQueryExecuter.java
Log:
Performance: cache query results
Revision Changes Path
No revision
No revision
1.1.4.1 +66 -60 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search/XQueryExecuter.java
Index: XQueryExecuter.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search/XQueryExecuter.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- XQueryExecuter.java 25 Mar 2004 16:18:02 -0000 1.1
+++ XQueryExecuter.java 9 Sep 2004 08:06:15 -0000 1.1.4.1
@@ -23,6 +23,8 @@
package org.apache.slide.store.tamino.datastore.search;
+import java.util.*;
+
import com.softwareag.common.instrumentation.logging.Level;
import com.softwareag.common.instrumentation.logging.Logger;
import com.softwareag.common.instrumentation.logging.LoggerFactory;
@@ -33,13 +35,6 @@
import com.softwareag.tamino.db.api.objectModel.TXMLObject;
import com.softwareag.tamino.db.api.objectModel.TXMLObjectIterator;
import com.softwareag.tamino.db.api.response.TResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
import org.apache.slide.common.SlideRuntimeException;
import org.apache.slide.search.RequestedResource;
import org.apache.slide.search.SearchException;
@@ -47,6 +42,7 @@
import org.apache.slide.search.basic.IBasicQuery;
import org.apache.slide.search.basic.IBasicResultSet;
import org.apache.slide.security.AccessDeniedException;
+import org.apache.slide.store.tamino.common.XDescriptorsHandler;
import org.apache.slide.store.tamino.common.XGlobals;
import org.apache.slide.store.tamino.datastore.XConnection;
import org.apache.slide.store.tamino.datastore.XConnectionKey;
@@ -55,6 +51,7 @@
import org.apache.slide.store.tamino.jdomobjects.XDescriptors;
import org.apache.slide.store.tamino.jdomobjects.XFactory;
import org.apache.slide.store.tamino.store.ISlideAccessor;
+import org.apache.slide.store.tamino.store.XParentStore;
import org.apache.slide.structure.ObjectNode;
import org.apache.slide.util.ClassName;
import org.apache.slide.util.Configuration;
@@ -72,14 +69,14 @@
* @version $Revision$
*/
public class XQueryExecuter implements IQueryExecuter {
-
+
private static final String LOGNAME = LoggerUtil.getThisClassName();
private static final String CLASSNAME = new ClassName(LOGNAME).getPlainName();
private static Logger logger = LoggerFactory.getLogger(LOGNAME);
-
+
private ISlideAccessor slideAccessor;
private XBasicQueryImpl query;
-
+
/**
* Constructor
*
@@ -89,7 +86,7 @@
this.slideAccessor = slideAccessor;
this.query = (XBasicQueryImpl) query;
}
-
+
/**
* executes the taminoQuery on xdav:metadata.
*
@@ -104,22 +101,22 @@
if( logger.isLoggable(Level.FINE) ){
logger.entering( CLASSNAME, "execute", new Object[] {taminoQuery} );
}
-
+
IBasicResultSet resultSet = new BasicResultSetImpl();
-
+
try {
XConnectionKey conKey = new XConnectionKey (slideAccessor, "XQueryExecuter");
XConnection con = XConnectionPool.getInstance().getXConnection (conKey);
TXMLObjectAccessor objAccessor =
con.newXMLJObjectAccessor (XGlobals.META_COLLECTION);
-
+
// System.out.println(taminoQuery);
TQuery tQuery = TQuery.newInstance (taminoQuery);
-
+
TResponse response;
-
+
if (query.isLimitDefined() && query.isMetaLimitAllowed ()) {
-
+
// we use a hidden feature of API: if only the first bunch
// of results is read from Tamino, local transaction mode is
// possible
@@ -129,25 +126,28 @@
response = objAccessor.query (tQuery);
}
con.close();
-
+
if (!response.getReturnValue().equals("0"))
throw new SearchException ("query failed, return value is " + response.getReturnValue());
-
+
TXMLObjectIterator it = response.getXMLObjectIterator();
-
+
boolean useBinding = Configuration.useBinding(query.getStore());
- ContentQueryFilter resultCache = new ContentQueryFilter (useBinding, it, query);
+
+ XDescriptorsHandler xdh = (XDescriptorsHandler)((XParentStore)slideAccessor).getDescriptorsStore().getDescriptorsHandler();
+
+ ContentQueryFilter resultCache = new ContentQueryFilter(useBinding, it, query, xdh);
Iterator nodeIterator = resultCache.getNodeIterator();
-
+
XPathPropertyExecuter propExecuter =
new XPathPropertyExecuter (query, resultCache, slideAccessor);
-
+
propExecuter.resolveXPathProperties();
-
+
while (nodeIterator.hasNext()) {
-
+
ObjectNode node = (ObjectNode)nodeIterator.next();
-
+
// ignore forbidden resources
try {
RequestedResource resource = new XResourceImpl (node, query, resultCache);
@@ -156,12 +156,12 @@
catch (AccessDeniedException e) {}
}
}
-
+
catch (Exception e) {
e.printStackTrace();
throw new SlideRuntimeException (e.getMessage(), true);
}
-
+
if( logger.isLoggable(Level.FINE) )
logger.exiting( CLASSNAME, "execute", resultSet);
return resultSet;
@@ -174,11 +174,11 @@
**/
class ContentQueryFilter implements IContentQueryFilter {
private Map inoIdMap = new HashMap ();
-
+
private List nodeList = new ArrayList (20);
-
+
private XPath xPath;
-
+
/**
* Constructor
*
@@ -191,44 +191,45 @@
*/
ContentQueryFilter (boolean useBinding,
TXMLObjectIterator resultIterator,
- XBasicQueryImpl query)
+ XBasicQueryImpl query,
+ XDescriptorsHandler xdh)
throws TException {
ObjectNode node;
-
+
LimitIterator it;
if (query.isLimitDefined() && query.isMetaLimitAllowed())
it = new LimitIterator (resultIterator, query.getLimit());
else
it = new LimitIterator (resultIterator, 0);
-
+
XDescriptorsMappingList lst = query.getDescriptorsMappingList();
try {
String xPathString = ".//descriptor/propertyList/" +
XGlobals.TAMINO_NAMESPACE_PREFIX + ":" +
XGlobals.CONTENT_ID + "/text()";
-
- // System.out.println (xPathString);
-
+
+ // System.out.println (xPathString);
+
xPath = new JDOMXPath (xPathString);
xPath.addNamespace (XGlobals.TAMINO_NAMESPACE_PREFIX, XGlobals.TAMINO_NAMESPACE_URI);
-
+
} catch (JaxenException e) {
throw new XAssertionFailed (e);
}
-
+
while (it.hasNext()) {
TXMLObject descsObject = null;
-
+
descsObject = it.next();
-
+
Element el = (Element) descsObject.getElement();
-
+
XContentId contentId = getContentId (el);
if (contentId != null) { // can happen for empty content or directories
-
+
String schema = contentId.getSchema();
String inoId = contentId.getId();
-
+
Set idList = (Set) inoIdMap.get (schema);
if (idList == null) {
idList = new HashSet (20);
@@ -236,25 +237,30 @@
}
idList.add (inoId);
}
+
XDescriptors xDescs = XFactory.loadDescriptor(el);
+
if (useBinding) {
XDescriptorsMapping mapping;
-
+
mapping = lst.lookup (xDescs.getUuri());
if (mapping == null) {
throw new XAssertionFailed ("descriptor not found: " + xDescs.getUuri());
}
nodeList.addAll (mapping.createObjectNodes(xDescs));
+ // ===============================================
+ // TODO: call xhd.cacheQueryResults() somehow here
+ // ===============================================
}
else {
-
node = xDescs.getUuriObjectNode();
node.setUri(node.getUuri());
nodeList.add (node);
+ xDescs = xdh.cacheQueryResult(node.getUri(), xDescs);
}
}
}
-
+
/**
* Method getContentId
*
@@ -265,23 +271,23 @@
*/
private XContentId getContentId (Element el) {
XContentId contentId = null;
-
+
try {
Iterator it = xPath.selectNodes(el).iterator();
-
+
if (it.hasNext()) {
-
+
Text tContentId = (Text)it.next();
contentId = new XContentId (tContentId.getText());
}
-
+
} catch (JaxenException e) {
throw new XAssertionFailed (e);
}
-
+
return contentId;
}
-
+
/**
* Method getNodeIterator
*
@@ -291,7 +297,7 @@
Iterator getNodeIterator () {
return nodeList.iterator();
}
-
+
/**
* Method getXPathFilter
*
@@ -313,10 +319,10 @@
}
sb.append ("]");
}
-
+
return sb.toString();
}
-
+
/**
* returns true, if the result set has entries for this schema
*
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org