/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package org.exoplatform.services.jcr.impl.core.query; import org.exoplatform.services.jcr.datamodel.QPath; import org.exoplatform.services.jcr.datamodel.QPathEntry; import javax.jcr.RepositoryException; /** * Implements a query node that defines a textsearch clause. */ public class TextsearchQueryNode extends QueryNode { /** * The query statement inside the textsearch clause */ private final String query; /** * Limits the scope of this textsearch clause to a node or a property with * the given relative path. * If <code>null</code> the scope of this textsearch clause is the fulltext * index of all properties of the context node. */ private QPath relPath; /** * If set to <code>true</code> {@link #relPath} references a property, * otherwise references a node. */ private boolean propertyRef; /** * Creates a new <code>TextsearchQueryNode</code> with a <code>parent</code> * and a textsearch <code>query</code> statement. The scope of the query * is the fulltext index of the node, that contains all properties. * * @param parent the parent node of this query node. * @param query the textsearch statement. */ protected TextsearchQueryNode(QueryNode parent, String query) { super(parent); this.query = query; this.relPath = null; this.propertyRef = false; } /** * {@inheritDoc} * @throws RepositoryException */ public Object accept(QueryNodeVisitor visitor, Object data) throws RepositoryException { return visitor.visit(this, data); } /** * Returns the type of this node. * * @return the type of this node. */ public int getType() { return QueryNode.TYPE_TEXTSEARCH; } /** * Returns the textsearch statement. * * @return the textsearch statement. */ public String getQuery() { return query; } /** * @return the relative path that references the item where the textsearch * is performed. Returns <code>null</code> if the textsearch is * performed on the context node. */ public QPath getRelativePath() { return relPath; } /** * Sets the relative path to the item where the textsearch is performed. If * <code>relPath</code> is <code>null</code> the textsearch is performed on * the context node. * * @param relPath the relative path to an item. * @throws IllegalArgumentException if <code>relPath</code> is absolute. */ public void setRelativePath(QPath relPath) { if (relPath != null && relPath.isAbsolute()) { throw new IllegalArgumentException("relPath must be relative"); } this.relPath = relPath; if (relPath == null) { // context node is never a property propertyRef = false; } } /** * Adds a path element to the existing relative path. To add a path element * which matches all node names use {@link RelationQueryNode#STAR_NAME_TEST}. * * @param element the path element to append. */ public void addPathElement(QPathEntry element) { if (relPath == null) this.relPath = new QPath(new QPathEntry[]{element}); else this.relPath = QPath.makeChildPath(relPath, element, element.getIndex()); } /** * @return <code>true</code> if {@link #getRelativePath()} references a * property, returns <code>false</code> if it references a node. */ public boolean getReferencesProperty() { return propertyRef; } /** * Is set to <code>true</code>, indicates that {@link #getRelativePath()} * references a property, if set to <code>false</code> indicates that it * references a node. * * @param b flag whether a property is referenced. */ public void setReferencesProperty(boolean b) { propertyRef = b; } /** * {@inheritDoc} */ public boolean equals(Object obj) { if (obj instanceof TextsearchQueryNode) { TextsearchQueryNode other = (TextsearchQueryNode) obj; return (query == null ? other.query == null : query.equals(other.query)) && (relPath == null ? other.relPath == null : relPath.equals(other.relPath) && propertyRef == other.propertyRef); } return false; } /** * {@inheritDoc} */ public boolean needsSystemTree() { return false; } }