<?php
namespace Incoviba\Common\Define\Query;

use Incoviba\Common\Define;

interface Select extends Define\Query
{
    /**
     * @param string|array $expressions
     * @return Select
     */
    public function columns(string|array $expressions): Select;

    /**
     * @param string $table
     * @return Select
     */
    public function from(string $table): Select;

    /**
     * @param string|array $joins
     * @return Select
     */
    public function joined(string|array $joins): Select;

    /**
     * @param string|array $conditions
     * @return Select
     */
    public function where(string|array $conditions): Select;

    /**
     * @param string|array $grouping
     * @return Select
     */
    public function group(string|array $grouping): Select;

    /**
     * @param string|array $conditions
     * @return Select
     */
    public function having(string|array $conditions): Select;

    /**
     * @param string|array $sorting
     * @return Select
     */
    public function order(string|array $sorting): Select;

    /**
     * @param int $limit
     * @param int|null $offset
     * @return Select
     */
    public function limit(int $limit, ?int $offset = null): Select;

    /**
     * @param int $offset
     * @return Select
     */
    public function offset(int $offset): Select;
}
