/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   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 .
 */
#ifndef __com_sun_star_sdb_XSingleSelectQueryComposer_idl__
#define __com_sun_star_sdb_XSingleSelectQueryComposer_idl__

#include <com/sun/star/beans/XPropertySet.idl>
#include <com/sun/star/beans/PropertyValue.idl>
#include <com/sun/star/lang/WrappedTargetException.idl>
#include <com/sun/star/sdbc/SQLException.idl>
#include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.idl>


 module com {  module sun {  module star {  module sdb {


/** simplifies the composing of single select statements.

    <p>
    The interface can be used for composing single SELECT statements without knowing the
    structure of the used query.
    </p>

    @see com::sun::star::sdb::SingleSelectQueryComposer
 */
interface XSingleSelectQueryComposer: XSingleSelectQueryAnalyzer
{
    // FILTER

    /** makes it possible to set a filter condition for the query.
        @param filter
            the filter to set
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs
            or the statement isn't valid
            or the statement isn't parsable.
     */
    void setFilter([in] string filter)
            raises (com::sun::star::sdbc::SQLException);

    /** appends a new set of filter criteria which is split into levels.
        @param filter
            The filter criteria is split into levels. Each level represents the
            OR criteria. Within each level, the filters are provided as an AND criteria
            with the name of the column and the filter condition. The filter condition
            is of type string. The operator used, is defined by com::sun::star::sdb::SQLFilterOperator.

        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs.
     */
    void setStructuredFilter([in] sequence< sequence<com::sun::star::beans::PropertyValue> > filter)
        raises (com::sun::star::sdbc::SQLException,com::sun::star::lang::IllegalArgumentException);

    /** appends a new filter condition by a
        com::sun::star::sdb::DataColumn
        providing the name and the value for the filter.
        The value property must be supported by the com::sun::star::sdb::DataColumn.
        @param column
            the column which is used to create a filter
        @param  andCriteria
            If `TRUE` the filter condition will be appended as an AND condition, otherwise
            the new filter condition will be appended as OR criteria.
            E.g. (xx AND bb AND cc) OR newCriteria
        @param  filterOperator
            The operator used, is defined by com::sun::star::sdb::SQLFilterOperator.
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs.
     */
    void appendFilterByColumn([in] com::sun::star::beans::XPropertySet column,[in] boolean andCriteria,[in] long filterOperator)
            raises (com::sun::star::sdbc::SQLException, com::sun::star::lang::WrappedTargetException);

    // GROUP BY


    /** makes it possible to set a group for the query.
        @param group
            the group part to set
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs
            or the statement isn't valid
            or the statement isn't parsable.
     */
    void setGroup([in] string group)
            raises (com::sun::star::sdbc::SQLException);


    /** appends an additional part to the group criteria of the select
        statement. The column must be a com::sun::star::sdbcx::Column.
        @param column
            the column which is used to create a group part
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs.
     */
    void appendGroupByColumn([in] com::sun::star::beans::XPropertySet column)
            raises (com::sun::star::sdbc::SQLException);

    // HAVING

    /** makes it possible to set a HAVING filter condition for the query.
        @param filter
            the filter to set
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs
            or the statement isn't valid
            or the statement isn't parsable.
     */
    void setHavingClause([in] string filter)
            raises (com::sun::star::sdbc::SQLException);


    /** appends a new set of HAVING filter criteria which is split into levels.
        @param filter
            The HAVING filter criteria is split into levels. Each level represents the
            OR criteria. Within each level, the filters are provided as an AND criteria
            with the name of the column and the filter condition. The filter condition
            is of type string. The operator used, is defined by com::sun::star::sdb::SQLFilterOperator.

        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs.
     */
    void setStructuredHavingClause([in] sequence< sequence<com::sun::star::beans::PropertyValue> > filter)
            raises (com::sun::star::sdbc::SQLException);

    /** appends a new HAVING filter condition by a
        com::sun::star::sdb::DataColumn
        providing the name and the value for the filter.
        @param column
            the column which is used to create a filter
        @param  andCriteria
            If `TRUE` the filter condition will be appended as an AND condition, otherwise
            the new filter condition will be appended as OR criteria.
            E.g. (xx AND bb AND cc) OR newCriteria
        @param  filterOperator
            The operator used, is defined by com::sun::star::sdb::SQLFilterOperator.
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs.
     */
    void appendHavingClauseByColumn([in] com::sun::star::beans::XPropertySet column,[in] boolean andCriteria,[in] long filterOperator)
            raises (com::sun::star::sdbc::SQLException, com::sun::star::lang::WrappedTargetException);

    // ORDER BY

    /** makes it possible to set a sort condition for the query.
        @param order
            the order part to set
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs
            or the order isn't valid
            or the statement isn't parsable.
     */
    void setOrder([in] string order)
            raises (com::sun::star::sdbc::SQLException);


    /** appends an additional part to the sort order criteria of the select
        statement. The column must be a com::sun::star::sdbcx::Column.
        @param column
            the column which is used to create a order part
        @param  ascending
            `TRUE` when the order should be ascending, otherwise if `FALSE` descending.
        @throws com::sun::star::sdbc::SQLException
            if a database access error occurs.
     */
    void appendOrderByColumn([in] com::sun::star::beans::XPropertySet column,
                             [in] boolean ascending)
            raises (com::sun::star::sdbc::SQLException);

    // cumulative composing

    /** sets a new elementary query for the composer

        <p>An elementary query or statement is a (single select) statement whose parts are
        not covered by the various set and get methods of the composer. That is, if the
        elementary statement contains a filter clause, a call to
        XSingleSelectQueryAnalyzer::getFilter() will not return you this
        filter. Instead, only filters which have been set using for instance setFilter()
        are covered by the get methods.</p>

        <p>The only methods which take all parts of the elementary statement into account are
        XSingleSelectQueryAnalyzer::getQuery() and
        XSingleSelectQueryAnalyzer::getQueryWithSubstitution(), which always returns
        the complete composed query.</p>

        <p>As a result, you can use the composer to build cumulative filter expressions. That
        is, you can set #ElementaryQuery to a statement already containing
        filters, and then use setFilter() to append additional filters.</p>

        <p>The very same holds for sort orders, <code>HAVING</code> and <code>GROUP BY</code>
        clauses.</p>

        <p>There are various use cases for this. For instance, you might want to use the
        statement represented by a QueryDefinition, and extend it with additional
        filters or sort orders, while not touching the respective parts already present
        in QueryDefinition::Command. This can be achieved by setting the
        QueryDefinition::Command as #ElementaryQuery of a
        SingleSelectQueryComposer.</p>

        <p>If, in such a scenario, you would be interested in the filter part of the
        QueryDefinition::Command, you would set it via
        XSingleSelectQueryAnalyzer::setQuery(), and retrieve the filter
        part via XSingleSelectQueryAnalyzer::getFilter().</p>

        <p>If you'd be interested in the composed filter, you would set the
        QueryDefinition::Command as #ElementaryQuery, add your
        filter, and propagate the resulting query (XSingleSelectQueryAnalyzer::getQuery())
        to an SingleSelectQueryAnalyzer instance via
        XSingleSelectQueryAnalyzer::setQuery().</p>
    */
    [attribute] string ElementaryQuery
    {
        set raises (com::sun::star::sdbc::SQLException);
    };
};


}; }; }; };

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
