/*
 * 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
 *
 *     https://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();
}
