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 df...@apache.org on 2005/12/12 15:36:53 UTC

svn commit: r356261 [3/3] - in /jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene: ./ expressions/

Modified: jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/AbstractLuceneExpression.java
URL: http://svn.apache.org/viewcvs/jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/AbstractLuceneExpression.java?rev=356261&r1=356260&r2=356261&view=diff
==============================================================================
--- jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/AbstractLuceneExpression.java (original)
+++ jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/AbstractLuceneExpression.java Mon Dec 12 06:36:39 2005
@@ -22,7 +22,12 @@
  */
 package org.apache.slide.index.lucene.expressions;
 
+import org.apache.slide.index.lucene.LuceneOrderBy;
+import org.apache.slide.index.lucene.LuceneBasicResultSetImpl;
+
 import java.io.IOException;
+import java.io.StringReader;
+import java.util.Iterator;
 import java.util.List;
 import java.util.StringTokenizer;
 
@@ -34,8 +39,14 @@
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.RangeQuery;
 import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+
+import org.apache.slide.search.CompareHint;
 import org.apache.slide.common.SlideException;
+import org.apache.slide.common.SlideTokenWrapper;
 import org.apache.slide.content.NodeProperty;
+import org.apache.slide.content.NodeRevisionDescriptor;
 import org.apache.slide.index.lucene.Index;
 import org.apache.slide.index.lucene.LuceneExpressionFactory;
 import org.apache.slide.search.BadQueryException;
@@ -50,224 +61,331 @@
 import org.apache.slide.search.basic.IBasicExpressionFactory;
 import org.apache.slide.search.basic.IBasicQuery;
 import org.apache.slide.search.basic.IBasicResultSet;
+import org.apache.slide.search.basic.OrderBy;
+import org.apache.slide.security.AccessDeniedException;
+import org.apache.slide.store.BindingStore;
 import org.apache.slide.structure.ObjectNode;
 import org.apache.slide.structure.SubjectNode;
+import org.apache.slide.util.Configuration;
 import org.apache.slide.util.logger.Logger;
 import org.apache.slide.content.NodeRevisionNumber;
 import org.jdom.Element;
-
+import org.jdom.JDOMException;
+import org.jdom.Namespace;
+import org.jdom.input.SAXBuilder;
 
 /**
  * 
  */
-public abstract class AbstractLuceneExpression implements IBasicExpression
-{
+public abstract class AbstractLuceneExpression implements IBasicExpression {
+
+	static final String LOG_CHANNEL = "org.apache.slide.index.lucene.expressions";
+
+	protected LuceneExpressionFactory factory;
+
+	protected Index index;
 
-    static final String LOG_CHANNEL = "org.apache.slide.index.lucene.expressions";
-    
-    protected LuceneExpressionFactory factory;
-    protected Index index;
-    private IBasicResultSet resultSet = null;
-    
-    private Query query;
-    
-    public AbstractLuceneExpression(Index index) {
-        this.index = index;
-    }
-
-    protected final void setQuery(Query query) {
-        this.query = query;
-    }
-    protected final Query getQuery() {
-        return this.query;
-    }
-
-    public IBasicExpressionFactory getFactory()
-    {
-        return factory;
-    }
-
-    public void setFactory(IBasicExpressionFactory factory)
-    {
-        this.factory = (LuceneExpressionFactory)factory;
-    }
-    
-    public IBasicResultSet execute() throws SearchException
-    {
-        if (this.resultSet != null) {
-            return this.resultSet;
-        }
-        
-        Query luceneQuery = this.getQuery();
-        
-        IBasicQuery q = factory.getQuery();
-        String scope = q.getSearchToken().getSlideContext().getSlidePath(
-                q.getScope().getHref());
-        if (scope.endsWith("/") && scope.length() > 1) {
-            scope = scope.substring(0, scope.length()-1);
-        }
-
-        // add a scope restriction, this allows negated queries too
-        BooleanQuery booleanQuery = new BooleanQuery();
-        booleanQuery.add(luceneQuery, true, false);
-        booleanQuery.add(new TermQuery(new Term(Index.SCOPE_FIELD_NAME, scope)), 
-                true, false);
-        
-        // add depth restriction
-        switch (q.getScope().getDepth() ) {
-            case QueryScope.DEPTH_INFINITY:
-                break;
-            case QueryScope.DEPTH_0:
-                booleanQuery.add(new TermQuery(new Term(Index.DEPTH_FIELD_NAME, 
-                        index.getConfiguration().intToIndexString(getDepth(scope)))), 
-                        true, false);
-                break;
-            case QueryScope.DEPTH_1:
-            default:
-                booleanQuery.add(new RangeQuery(
-                        new Term(Index.DEPTH_FIELD_NAME, 
-                                index.getConfiguration().intToIndexString(getDepth(scope))), 
-                        new Term(Index.DEPTH_FIELD_NAME,
-                                index.getConfiguration().intToIndexString(getDepth(scope)+q.getScope().getDepth())),
-                        true), 
-                     true, false);
-
-                    
-        }
-        luceneQuery = booleanQuery;
-
-        IndexSearcher searcher = null;
-        try {
-            if (index.getLogger().isEnabled(LOG_CHANNEL, Logger.DEBUG)) {
-                index.getLogger().log("start query execution: " + 
-                        luceneQuery.toString(), LOG_CHANNEL, Logger.DEBUG);
-            }
-            long start = System.currentTimeMillis();
-    
-            searcher = this.index.getSearcher();
-            Hits hits = searcher.search(luceneQuery);
-            
-            if (index.getLogger().isEnabled(LOG_CHANNEL, Logger.DEBUG)) {
-                index.getLogger().log("finished: " + hits.length() + " hits (" + 
-                        (System.currentTimeMillis() - start) + "ms)" , LOG_CHANNEL, Logger.DEBUG);
-            }
-
-            IBasicResultSet result = new BasicResultSetImpl(false);
-
-            for (int i = 0, l = hits.length(); i < l; i++) {
-                Document doc = hits.doc(i);
-                String uri = doc.get(Index.URI_FIELD_NAME);
-                String number = doc.get(Index.REVISION_FIELD_NAME);
-                NodeRevisionNumber nodeNumber = new NodeRevisionNumber(number);
-                RequestedResource resource = createResource(uri, nodeNumber);
-                result.add(resource);
-            }
-            
-            this.resultSet = result;
-            return result;
-        } catch (InvalidScopeException e) {
-            throw e;
-        } catch (SearchException e) {
-            throw e;
-        } catch (IOException e) {
-            throw new SearchException(e);
-        } finally {
-            if (searcher != null) {
-                try {
-                    searcher.close();
-                } catch (IOException e1) {
-                    // ignore
-                }
-            }
-        }
-    }
-    
-    private int getDepth(String path) {
-        StringTokenizer tokenizer = new StringTokenizer(path, "/");
-        return tokenizer.countTokens();
-    }
-    
-    protected Query negateQuery(Query query) {
-        BooleanQuery booleanQuery = new BooleanQuery();
-        booleanQuery.add(
-                allQuery(), 
-                true, false);
-        booleanQuery.add(
-                query, 
-                false, true);
-        return booleanQuery;
-    }
-    
-    protected Query allQuery() {
-        return new TermQuery(new Term(Index.SCOPE_FIELD_NAME, "/"));
-    }
-
-    protected RequestedResource createResource(String uri, NodeRevisionNumber nodeNumber) throws SearchException
-    {
-        ObjectNode node = new SubjectNode(uri); // this will return the root
-                                                // folder
-        RequestedResource resource = null;
-        IBasicQuery query = factory.getQuery();
-        
-        try {
-            resource = new ComparableResourceImpl(node, query.getSearchToken(),
-                    query.getScope(), factory.getPropertyProvider(), nodeNumber);
-        } catch (SlideException e) {
-            throw new SearchException(e);
-        }
-        return resource;
-    }
-
-    protected static Element getFirstElement(Element node)
-    {
-        List children = node.getChildren();
-        
-        for (int i = 0; i < children.size(); i++) {
-            if (children.get(i) instanceof Element) {
-                return (Element)children.get(i); 
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the first <code>D:prop</code> element. 
-     * @param operator
-     * @return Element 
-     * @throws BadQueryException if element not found
-     */
-    public static Element getPropertyElement(Element operator) throws BadQueryException
-    {
-        Element prop = operator.getChild("prop", 
-                NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
-        if (prop == null) throw new InvalidQueryException("Missing prop element"); 
-        
-        prop = getFirstElement(prop);
-        if (prop == null) throw new InvalidQueryException("Empty prop element given");
-        return prop;
-    }
-    /**
-     * Retruns the first <code>D:literal</code> element.
-     * @param operator
-     * @return
-     * @throws BadQueryException if element not found
-     */
-    protected Element getLiteralElement(Element operator) throws BadQueryException
-    {
-        Element literal = operator.getChild("literal", 
-                NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
-        if (literal == null) throw new InvalidQueryException("Missing literal element");
-        return literal;
-    }    
-
-    protected Element getLiteral2Element(Element operator) throws BadQueryException
-    {
-        List children = operator.getChildren("literal", 
-                NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
-        if (children.size() > 1) {
-            return (Element)children.get(1);
-        } else {
-            throw new InvalidQueryException("Missing second literal element");
-        }
-    }
+	private IBasicResultSet resultSet = null;
+
+	private Query query;
+	
+	private SAXBuilder saxBuilder = new SAXBuilder();
+
+	public AbstractLuceneExpression(Index index) {
+		this.index = index;
+	}
+
+	protected final void setQuery(Query query) {
+		this.query = query;
+	}
+
+	protected final Query getQuery() {
+		return this.query;
+	}
+
+	public IBasicExpressionFactory getFactory() {
+		return factory;
+	}
+
+	public void setFactory(IBasicExpressionFactory factory) {
+		this.factory = (LuceneExpressionFactory) factory;
+	}
+
+	public IBasicResultSet execute() throws SearchException {
+		return this.execute(null, -1);
+	}
+
+	public IBasicResultSet execute(OrderBy orderBy) throws SearchException {
+		return this.execute(orderBy, -1);
+	}
+
+	public IBasicResultSet execute(OrderBy orderBy, int limit)
+			throws SearchException {
+		if (this.resultSet != null) {
+			return this.resultSet;
+		}
+
+		Query luceneQuery = this.getQuery();
+
+		IBasicQuery q = factory.getQuery();
+		String scope = q.getSearchToken().getSlideContext().getSlidePath(
+				q.getScope().getHref());
+		if (scope.endsWith("/") && scope.length() > 1) {
+			scope = scope.substring(0, scope.length() - 1);
+		}
+
+		// add a scope restriction, this allows negated queries too
+		BooleanQuery booleanQuery = new BooleanQuery();
+
+		if (luceneQuery != null)
+			booleanQuery.add(luceneQuery, true, false);
+
+		booleanQuery.add(
+				new TermQuery(new Term(Index.SCOPE_FIELD_NAME, scope)), true,
+				false);
+
+		int queryScopeHrefDepth = getDepth(scope);
+
+		// add depth restriction
+		switch (q.getScope().getDepth()) {
+		case QueryScope.DEPTH_INFINITY:
+			break;
+		case QueryScope.DEPTH_0:
+			booleanQuery.add(
+					new TermQuery(new Term(Index.DEPTH_FIELD_NAME, index
+							.getConfiguration().intToIndexString(
+									getDepth(scope)))), true, false);
+			break;
+		case QueryScope.DEPTH_1:
+		default:
+			booleanQuery
+					.add(
+							new RangeQuery(
+									new Term(Index.DEPTH_FIELD_NAME, index
+											.getConfiguration()
+											.intToIndexString(getDepth(scope))),
+									new Term(
+											Index.DEPTH_FIELD_NAME,
+											index
+													.getConfiguration()
+													.intToIndexString(
+															getDepth(scope)
+																	+ q
+																			.getScope()
+																			.getDepth())),
+									true), true, false);
+
+		}
+
+		luceneQuery = booleanQuery;
+
+		Sort sorter = null;
+		if (orderBy != null && orderBy instanceof LuceneOrderBy) {
+			sorter = ((LuceneOrderBy) orderBy).getSorter();
+
+			if (index.getLogger().isEnabled(LOG_CHANNEL, Logger.DEBUG)) {
+				index.getLogger().log(
+						" Gotten a sorter! from LuceneOrderBy " + sorter,
+						LOG_CHANNEL, Logger.DEBUG);
+			}
+		}
+
+		IndexSearcher searcher = null;
+		try {
+			if (index.getLogger().isEnabled(LOG_CHANNEL, Logger.DEBUG)) {
+				index.getLogger().log(
+						"start query execution: " + luceneQuery.toString(),
+						LOG_CHANNEL, Logger.DEBUG);
+			}
+			long start = System.currentTimeMillis();
+
+			searcher = this.index.getSearcher();
+			Hits hits = null;
+
+			if (sorter != null) {
+				hits = searcher.search(luceneQuery, sorter);
+
+				if (index.getLogger().isEnabled(LOG_CHANNEL, Logger.DEBUG)) {
+					index.getLogger().log(" Query uses sorter! " + sorter,
+							LOG_CHANNEL, Logger.DEBUG);
+				}
+			} else
+				hits = searcher.search(luceneQuery);
+
+			if (index.getLogger().isEnabled(LOG_CHANNEL, Logger.DEBUG)) {
+				index.getLogger().log(
+						"finished: " + hits.length() + " hits ("
+								+ (System.currentTimeMillis() - start) + "ms)",
+						LOG_CHANNEL, Logger.DEBUG);
+			}
+
+			IBasicResultSet result = new LuceneBasicResultSetImpl(false);
+
+			int counter = 0;
+			for (int i = 0, l = hits.length(); (i < l)
+					&& (limit < 0 || counter < limit); i++) {
+				Document doc = hits.doc(i);
+				String uri = doc.get(Index.URI_FIELD_NAME);
+				String number = doc.get(Index.REVISION_FIELD_NAME);
+				NodeRevisionNumber nodeNumber = new NodeRevisionNumber(number);
+				RequestedResource resource = null;
+
+				// TODO: This is just a quick hack to enable DASL with binding store
+				// Please replace with something less evel!
+				// At least the INDEXED_BINDING_URI_IDENTIFIER prefix should be added at indexing time
+				if (Configuration.useGlobalBinding()) {
+					resource = createResource(BindingStore.INDEXED_BINDING_URI_IDENTIFIER + uri, nodeNumber);
+					if (resource != null) {
+						try {
+							NodeProperty parentProperty = resource.getProperty(
+									"parent-set",
+									NodeProperty.DEFAULT_NAMESPACE);
+							String parentValue = "<parents>"+parentProperty.getValue()+"</parents>";
+							// Get bindings for resource
+							org.jdom.Document parentDocument = saxBuilder.build(new StringReader((String)parentValue));
+							List parents = parentDocument.getRootElement().getChildren();
+							for ( Iterator parentIterator = parents.iterator(); parentIterator.hasNext(); ) {
+								Element parent = (Element)parentIterator.next();
+								String href = parent.getChild("href", Namespace.getNamespace("DAV:")).getText();
+								String segment = parent.getChild("segment", Namespace.getNamespace("DAV:")).getText();
+								RequestedResource binding = (RequestedResource)resource.clone();
+								binding.setUri(href+"/"+segment);
+								result.add(binding);
+								counter++;
+							}
+						} catch (SlideException e) {
+							throw new SearchException("Property 'parent-set' must be present when using binding enabled search", e);
+						} catch (JDOMException e) {
+							throw new SearchException("Malformed 'parent-set' property value", e);
+						}
+					}
+				} else {
+					resource = createResource(uri, nodeNumber);
+					if (resource != null) {
+						result.add(resource);
+						counter++;
+					}
+				}
+			}
+			this.resultSet = result;
+			return result;
+		} catch (InvalidScopeException e) {
+			throw e;
+		} catch (SearchException e) {
+			throw e;
+		} catch (IOException e) {
+			throw new SearchException(e);
+		} finally {
+			if (searcher != null) {
+				try {
+					searcher.close();
+				} catch (IOException e1) {
+					// ignore
+				}
+			}
+		}
+	}
+
+	private int getDepth(String path) {
+		StringTokenizer tokenizer = new StringTokenizer(path, "/");
+		return tokenizer.countTokens();
+	}
+
+	protected Query negateQuery(Query query) {
+		BooleanQuery booleanQuery = new BooleanQuery();
+		booleanQuery.add(allQuery(), true, false);
+		booleanQuery.add(query, false, true);
+		return booleanQuery;
+	}
+
+	protected Query allQuery() {
+		return new TermQuery(new Term(Index.SCOPE_FIELD_NAME, "/"));
+	}
+
+	protected RequestedResource createResource(String uri,
+			NodeRevisionNumber nodeNumber) throws SearchException {
+		ObjectNode node = new SubjectNode(uri); // this will return the root
+		// folder
+		RequestedResource resource = null;
+		IBasicQuery query = factory.getQuery();
+
+		SlideTokenWrapper token = new SlideTokenWrapper(query.getSearchToken()
+				.getSlideToken());
+		token.setForceLock(false);
+
+		try {
+			// resource = new ComparableResourceImpl(node,
+			// query.getSearchToken(),
+			// query.getScope(), factory.getPropertyProvider());
+
+			resource = new ComparableResourceImpl(node, query.getSearchToken(),
+					query.getScope(), factory.getPropertyProvider(), nodeNumber);
+		} catch (AccessDeniedException e) {
+			// ignore, just not visible due to permissions
+			resource = null;
+		} catch (SlideException e) {
+			throw new SearchException(e);
+		}
+		return resource;
+	}
+
+	protected static Element getFirstElement(Element node) {
+		List children = node.getChildren();
+
+		for (int i = 0; i < children.size(); i++) {
+			if (children.get(i) instanceof Element) {
+				return (Element) children.get(i);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the first <code>D:prop</code> element.
+	 * 
+	 * @param operator
+	 * @return Element
+	 * @throws BadQueryException
+	 *             if element not found
+	 */
+	public static Element getPropertyElement(Element operator)
+			throws BadQueryException {
+		Element prop = operator.getChild("prop",
+				NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
+		if (prop == null)
+			throw new InvalidQueryException("Missing prop element");
+
+		prop = getFirstElement(prop);
+		if (prop == null)
+			throw new InvalidQueryException("Empty prop element given");
+		return prop;
+	}
+
+	/**
+	 * Retruns the first <code>D:literal</code> element.
+	 * 
+	 * @param operator
+	 * @return
+	 * @throws BadQueryException
+	 *             if element not found
+	 */
+	protected Element getLiteralElement(Element operator)
+			throws BadQueryException {
+		Element literal = operator.getChild("literal",
+				NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
+		if (literal == null)
+			throw new InvalidQueryException("Missing literal element");
+		return literal;
+	}
+
+	protected Element getLiteral2Element(Element operator)
+			throws BadQueryException {
+		List children = operator.getChildren("literal",
+				NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
+		if (children.size() > 1) {
+			return (Element) children.get(1);
+		} else {
+			throw new InvalidQueryException("Missing second literal element");
+		}
+	}
 }

Modified: jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/LikeExpression.java
URL: http://svn.apache.org/viewcvs/jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/LikeExpression.java?rev=356261&r1=356260&r2=356261&view=diff
==============================================================================
--- jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/LikeExpression.java (original)
+++ jakarta/slide/trunk/src/stores/org/apache/slide/index/lucene/expressions/LikeExpression.java Mon Dec 12 06:36:39 2005
@@ -99,10 +99,4 @@
         
         return result.toString();
     }
-    
-    public static void main(String[] a) {
-        System.out.println("abc".indexOf("c"));
-        System.out.println("abc".substring(0, "abc".length()-1));
-    }
-
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org