blob: 4dbfdd9dca075f21a00d60d619469cf29b4e470b [file] [log] [blame]
/*
* 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.apache.jackrabbit.oak.jcr.query.qom;
import javax.jcr.RepositoryException;
import javax.jcr.query.qom.Comparison;
import javax.jcr.query.qom.DynamicOperand;
import javax.jcr.query.qom.QueryObjectModelConstants;
import javax.jcr.query.qom.QueryObjectModelFactory;
import javax.jcr.query.qom.StaticOperand;
/**
* Enumeration of the JCR 2.0 query operators.
*
* @since Apache Jackrabbit 2.0
*/
public enum Operator {
EQ(QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, "="),
NE(QueryObjectModelConstants.JCR_OPERATOR_NOT_EQUAL_TO, "!=", "<>"),
GT(QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN, ">"),
GE(QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO, ">="),
LT(QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN, "<"),
LE(QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN_OR_EQUAL_TO, "<="),
LIKE(QueryObjectModelConstants.JCR_OPERATOR_LIKE, null, "like");
/**
* JCR name of this operator.
*/
private final String name;
/**
* This operator in XPath syntax.
*/
private final String xpath;
/**
* This operator in SQL syntax.
*/
private final String sql;
Operator(String name, String op) {
this(name, op, op);
}
Operator(String name, String xpath, String sql) {
this.name = name;
this.xpath = xpath;
this.sql = sql;
}
/**
* Returns a comparison between the given operands using this operator.
*
* @param factory factory for creating the comparison
* @param left operand on the left hand side
* @param right operand on the right hand side
* @return comparison
* @throws RepositoryException if the comparison can not be created
*/
public Comparison comparison(
QueryObjectModelFactory factory,
DynamicOperand left, StaticOperand right)
throws RepositoryException {
return factory.comparison(left, name, right);
}
/**
* Formats an XPath constraint with this operator and the given operands.
* The operands are simply used as-is, without any quoting or escaping.
*
* @param a first operand
* @param b second operand
* @return XPath constraint, {@code a op b} or
* {@code jcr:like(a, b)} for {@link #LIKE}
*/
public String formatXpath(String a, String b) {
if (this == LIKE) {
return "jcr:like(" + a + ", " + b + ')';
}
return a + ' ' + xpath + ' ' + b;
}
/**
* Formats an SQL constraint with this operator and the given operands.
* The operands are simply used as-is, without any quoting or escaping.
*
* @param a first operand
* @param b second operand
* @return SQL constraint, {@code a op b}
*/
public String formatSql(String a, String b) {
return a + ' ' + sql + ' ' + b;
}
/**
* Returns the JCR 2.0 name of this query operator.
*
* @see QueryObjectModelConstants
* @return JCR name of this operator
*/
@Override
public String toString() {
return name;
}
/**
* Returns an array of the names of all the JCR 2.0 query operators.
*
* @return names of all query operators
*/
public static String[] getAllQueryOperators() {
return new String[] {
EQ.toString(),
NE.toString(),
GT.toString(),
GE.toString(),
LT.toString(),
LE.toString(),
LIKE.toString()
};
}
/**
* Returns the operator with the given JCR name.
*
* @param name JCR name of an operator
* @return operator with the given name
*/
public static Operator getOperatorByName(String name) {
for (Operator operator : Operator.values()) {
if (operator.name.equals(name)) {
return operator;
}
}
throw new IllegalArgumentException("Unknown operator name: " + name);
}
}