/*
 * 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;

/**
 * Expression representing the ordering using an expression and a direction.
 *
 * @param <T> Java type of the expression being represented here
 */
public interface OrderExpression<T> {
  public enum OrderDirection {
    ASC,
    DESC
  }

  public enum OrderNullsPosition {
    FIRST,
    LAST
  }

  /**
   * Accessor for the direction of the ordering with this expression.
   *
   * @return The direction
   */
  OrderDirection getDirection();

  /**
   * Accessor for the expression being used for ordering.
   *
   * @return Ordering expression
   */
  Expression<T> getExpression();

  /**
   * Accessor for the position of nulls with this expression.
   *
   * @return The nulls position (or null if not defined)
   */
  OrderNullsPosition getNullsPosition();

  /**
   * Method to set nulls to be ordered BEFORE non-nulls.
   *
   * @return The order expression
   */
  OrderExpression<T> nullsFirst();

  /**
   * Method to set nulls to be ordered AFTER non-nulls.
   *
   * @return The order expression
   */
  OrderExpression<T> nullsLast();
}
