blob: 6025c64785c546c7d4e0176f3127d80840b5eafc [file]
<?php
/*
* 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.
*/
namespace Apache\Ignite\Query;
use Apache\Ignite\Exception\ClientException;
use Apache\Ignite\Internal\Binary\ClientOperation;
use Apache\Ignite\Internal\Binary\MessageBuffer;
use Apache\Ignite\Internal\Binary\BinaryCommunicator;
use Apache\Ignite\Internal\Query\SqlFieldsCursor;
/**
* Class representing an SQL Fields query.
*/
class SqlFieldsQuery extends SqlQuery
{
/** @name SqlFieldsQueryStatementType
* @anchor SqlFieldsQueryStatementType
* @{
*/
const STATEMENT_TYPE_ANY = 0;
const STATEMENT_TYPE_SELECT = 1;
const STATEMENT_TYPE_UPDATE = 2;
/** @} */ // end of SqlFieldsQueryStatementType
private $schema;
private $maxRows;
private $statementType;
private $enforceJoinOrder;
private $collocated;
private $lazy;
private $includeFieldNames;
/**
* Public constructor.
*
* Requires SQL query string to be specified.
* Other SQL Fields query settings have the following defaults:
* <pre>
* SQL Fields Query setting : Default value
* Local query flag : false
* Cursor page size : 1024
* Query arguments : not specified
* Distributed joins flag : false
* Replicated only flag : false
* Timeout : 0 (disabled)
* Schema for the query : not specified
* Max rows : -1
* Statement type : STATEMENT_TYPE_ANY
* Enforce join order flag : false
* Collocated flag : false
* Lazy query execution flag : false
* Include field names flag : false
* </pre>
* Every setting may be changed using set methods.
*
* @param string $sql SQL query string.
*
* @throws ClientException if error.
*/
public function __construct(string $sql)
{
parent::__construct(null, $sql);
$this->operation = ClientOperation::QUERY_SQL_FIELDS;
$this->schema = null;
$this->maxRows = -1;
$this->statementType = SqlFieldsQuery::STATEMENT_TYPE_ANY;
$this->enforceJoinOrder = false;
$this->collocated = false;
$this->lazy = false;
$this->includeFieldNames = false;
}
/**
* Set schema for the query.
*
* @param string $schema schema for the query.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setSchema(string $schema): SqlFieldsQuery
{
$this->schema = $schema;
return $this;
}
/**
* Set max rows.
*
* @param int $maxRows max rows.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setMaxRows(int $maxRows): SqlFieldsQuery
{
$this->maxRows = $maxRows;
return $this;
}
/**
* Set statement type.
*
* @param int $type statement type, one of @ref SqlFieldsQueryStatementType constants.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setStatementType(int $type): SqlFieldsQuery
{
$this->statementType = $type;
return $this;
}
/**
* Set enforce join order flag.
*
* @param bool $enforceJoinOrder enforce join order flag: true or false.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setEnforceJoinOrder(bool $enforceJoinOrder): SqlFieldsQuery
{
$this->enforceJoinOrder = $enforceJoinOrder;
return $this;
}
/**
* Set collocated flag.
*
* @param bool $collocated collocated flag: true or false.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setCollocated(bool $collocated): SqlFieldsQuery
{
$this->collocated = $collocated;
return $this;
}
/**
* Set lazy query execution flag.
*
* @param bool $lazy lazy query execution flag: true or false.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setLazy(bool $lazy): SqlFieldsQuery
{
$this->lazy = $lazy;
return $this;
}
/**
* Set include field names flag.
*
* @param bool $includeFieldNames include field names flag: true or false.
*
* @return SqlFieldsQuery the same instance of the SqlFieldsQuery.
*/
public function setIncludeFieldNames(bool $includeFieldNames): SqlFieldsQuery
{
$this->includeFieldNames = $includeFieldNames;
return $this;
}
// This is not the public API method, is not intended for usage by an application.
public function write(BinaryCommunicator $communicator, MessageBuffer $buffer): void
{
BinaryCommunicator::writeString($buffer, $this->schema);
$buffer->writeInteger($this->pageSize);
$buffer->writeInteger($this->maxRows);
BinaryCommunicator::writeString($buffer, $this->sql);
$this->writeArgs($communicator, $buffer);
$buffer->writeByte($this->statementType);
$buffer->writeBoolean($this->distributedJoins);
$buffer->writeBoolean($this->local);
$buffer->writeBoolean($this->replicatedOnly);
$buffer->writeBoolean($this->enforceJoinOrder);
$buffer->writeBoolean($this->collocated);
$buffer->writeBoolean($this->lazy);
$buffer->writeLong($this->timeout);
$buffer->writeBoolean($this->includeFieldNames);
}
// This is not the public API method, is not intended for usage by an application.
public function getCursor(BinaryCommunicator $communicator, MessageBuffer $payload, $keyType = null, $valueType = null): CursorInterface
{
$cursor = new SqlFieldsCursor($communicator, $payload);
$cursor->readFieldNames($payload, $this->includeFieldNames);
return $cursor;
}
}