/*
 * 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 javax.jdo.query;

/**
 * Representation of a string in a query.
 */
public interface StringExpression extends ComparableExpression<String>
{
    /**
     * Method to return an expression for this expression added to the passed expression (String concatenation).
     * @param expr The other expression
     * @return The summation
     */
    StringExpression add(Expression expr);

    /**
     * Method to return an expression for this expression added to the passed string (String concatenation).
     * @param str The other string
     * @return The summation
     */
    StringExpression add(String str);

    /**
     * Method to return an expression for the character at a position of this string expression.
     * @param pos The position
     * @return Expression for the character
     */
    CharacterExpression charAt(int pos);

    /**
     * Method to return an expression for the character at a position of this string expression.
     * @param pos The position
     * @return Expression for the character
     */
    CharacterExpression charAt(NumericExpression<Integer> pos);

    /**
     * Method returning an expression for whether this string expression ends with the passed string expression.
     * @param expr The expression that it ends with.
     * @return Whether it ends with the other string
     */
    BooleanExpression endsWith(StringExpression expr);

    /**
     * Method returning an expression for whether this string expression ends with the passed string expression.
     * @param str The string that it ends with.
     * @return Whether it ends with the other string
     */
    BooleanExpression endsWith(String str);

    /**
     * Method returning an expression for whether this string expression is equal to (ignoring case) the 
     * passed string expression.
     * @param expr The expression
     * @return Whether they are equal
     */
    BooleanExpression equalsIgnoreCase(StringExpression expr);

    /**
     * Method returning an expression for whether this string expression is equal to (ignoring case) the 
     * passed string.
     * @param str The string
     * @return Whether they are equal
     */
    BooleanExpression equalsIgnoreCase(String str);

    /**
     * Method to return an expression for the position of the passed string in this string.
     * @param expr The other string
     * @return Expression for the position of the passed string
     */
    NumericExpression<Integer> indexOf(StringExpression expr);

    /**
     * Method to return an expression for the position of the passed string in this string.
     * @param str The other string
     * @return Expression for the position of the passed string
     */
    NumericExpression<Integer> indexOf(String str);

    /**
     * Method to return an expression for the position of the passed string in this string after a position.
     * @param expr The other string
     * @param pos Start point of the search
     * @return Expression for the position of the passed string
     */
    NumericExpression<Integer> indexOf(StringExpression expr, NumericExpression<Integer> pos);

    /**
     * Method to return an expression for the position of the passed string in this string after a position.
     * @param str The other string
     * @param pos Start point of the search
     * @return Expression for the position of the passed string
     */
    NumericExpression<Integer> indexOf(String str, NumericExpression<Integer> pos);

    /**
     * Method to return an expression for the position of the passed string in this string after a position.
     * @param str The other string
     * @param pos Start point of the search
     * @return Expression for the position of the passed string
     */
    NumericExpression<Integer> indexOf(String str, int pos);

    /**
     * Method to return an expression for the position of the passed string in this string after a position.
     * @param expr The other string
     * @param pos Start point of the search
     * @return Expression for the position of the passed string
     */
    NumericExpression<Integer> indexOf(StringExpression expr, int pos);

    /**
     * Method returning a expression for the length of this string.
     * @return Expression for the length
     */
    NumericExpression<Integer> length();

    /**
     * Method to return an expression for whether this string expression matches the provided expression.
     * @param expr The expression to match against
     * @return Whether this expression matches the provided expression
     */
    BooleanExpression matches(StringExpression expr);

    /**
     * Method to return an expression for whether this string expression matches the provided string.
     * @param str String literal to match against
     * @return Whether this expression matches the provided string
     */
    BooleanExpression matches(String str);

    /**
     * Method returning an expression for whether this string expression starts with the passed string expression.
     * @param expr The expression that it starts with.
     * @return Whether it starts with the other string
     */
    BooleanExpression startsWith(StringExpression expr);

    /**
     * Method returning an expression for whether this string expression starts with the passed string.
     * @param str The string that it starts with.
     * @return Whether it starts with the other string
     */
    BooleanExpression startsWith(String str);

    /**
     * Method returning an expression for whether the substring of this string beginning at the specified
     * index starts with the passed string expression.
     * @param expr The expression that it starts with.
     * @param index where to begin looking in this string
     * @return Whether it starts with the other string
     */
    BooleanExpression startsWith(StringExpression expr, int index);

    /**
     * Method returning an expression for whether the substring of this string beginning at the specified
     * index starts with the passed string.
     * @param str The string that it starts with.
     * @param index where to begin looking in this string
     * @return Whether it starts with the other string
     */
    BooleanExpression startsWith(String str, int index);

    /**
     * Method to return an expression for the substring of this string expression.
     * @param pos The position of the start point of the substring
     * @return Expression for the substring
     */
    StringExpression substring(NumericExpression<Integer> pos);

    /**
     * Method to return an expression for the substring of this string expression.
     * @param pos The position of the start point of the substring
     * @return Expression for the substring
     */
    StringExpression substring(int pos);

    /**
     * Method to return an expression for the substring of this string expression.
     * @param startPos The position of the start point of the substring (inclusive, origin 0)
     * @param endPos The position of the end point of the substring (exclusive, origin 0)
     * @return Expression for the substring
     */
    StringExpression substring(NumericExpression<Integer> startPos, NumericExpression<Integer> endPos);

    /**
     * Method to return an expression for the substring of this string expression.
     * @param startPos The position of the start point of the substring (inclusive, origin 0)
     * @param endPos The position of the end point of the substring (exclusive, origin 0)
     * @return Expression for the substring
     */
    StringExpression substring(int startPos, int endPos);

    /**
     * Method to return a StringExpression representing this string expression in lower case.
     * @return The lower case expression
     */
    StringExpression toLowerCase();

    /**
     * Method to return a StringExpression representing this string expression in upper case.
     * @return The upper case expression
     */
    StringExpression toUpperCase();

    /**
     * Method returning a string expression with whitespace trimmed from start and end.
     * @return String expression with whitespace trimmed
     */
    StringExpression trim();
}