blob: 50cc08bc29fcfe402758e2848da0a3417d7850ce [file] [log] [blame]
<?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\Type\ObjectType;
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\Binary\BinaryUtils;
use Apache\Ignite\Internal\Query\Cursor;
use Apache\Ignite\Internal\Utils\ArgumentChecker;
/**
* Class representing an SQL query which returns the whole cache entries (key-value pairs).
*/
class SqlQuery extends Query
{
private $args;
private $argTypes;
protected $sql;
protected $type;
protected $distributedJoins;
protected $replicatedOnly;
protected $timeout;
/**
* Public constructor.
*
* Requires name of a type (or SQL table) and SQL query string to be specified.
* Other SQL query settings have the following defaults:
* <pre>
* SQL 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)
* </pre>
* Every setting may be changed using set methods.
*
* @param string $type name of a type or SQL table.
* @param string $sql SQL query string.
*
* @throws ClientException if error.
*/
public function __construct(?string $type, string $sql)
{
parent::__construct(ClientOperation::QUERY_SQL);
$this->setType($type);
$this->setSql($sql);
$this->args = null;
$this->argTypes = null;
$this->distributedJoins = false;
$this->replicatedOnly = false;
$this->timeout = 0;
}
/**
* Set name of a type or SQL table.
*
* @param string $type name of a type or SQL table.
*
* @return SqlQuery the same instance of the SqlQuery.
*
* @throws ClientException if error.
*/
public function setType(?string $type): SqlQuery
{
if ($this instanceof SqlFieldsQuery) {
ArgumentChecker::invalidArgument($type, 'type', SqlFieldsQuery::class);
}
$this->type = $type;
return $this;
}
/**
* Set SQL query string.
*
* @param string $sql SQL query string.
*
* @return SqlQuery the same instance of the SqlQuery.
*/
public function setSql(string $sql): SqlQuery
{
$this->sql = $sql;
return $this;
}
/**
* Set query arguments.
*
* Type of any argument may be specified using setArgTypes() method.
* If type of an argument is not specified then during operations the Ignite client
* will try to make automatic mapping between PHP types and Ignite object types -
* according to the mapping table defined in the description of the ObjectType class.
*
* @param mixed ...$args Query arguments.
*
* @return SqlQuery the same instance of the SqlQuery.
*/
public function setArgs(...$args): SqlQuery
{
$this->args = $args;
return $this;
}
/**
* Specifies types of query arguments.
*
* Query arguments itself are set using setArgs() method.
* By default, a type of every argument is not specified that means during operations the Ignite client
* will try to make automatic mapping between PHP types and Ignite object types -
* according to the mapping table defined in the description of the ObjectType class.
*
* @param int|ObjectType|null ...$argTypes types of Query arguments.
* The order of types must follow the order of arguments in the setArgs() method.
* A type of every argument can be:
* - either a type code of primitive (simple) type (@ref PrimitiveTypeCodes)
* - or an instance of class representing non-primitive (composite) type
* - or null (or not specified) that means the type is not specified
*
* @return SqlQuery the same instance of the SqlQuery.
*
* @throws ClientException if error.
*/
public function setArgTypes(...$argTypes): SqlQuery
{
foreach ($argTypes as $argType) {
BinaryUtils::checkObjectType($argType, 'argTypes');
}
$this->argTypes = $argTypes;
return $this;
}
/**
* Set distributed joins flag.
*
* @param bool $distributedJoins distributed joins flag: true or false.
*
* @return SqlQuery the same instance of the SqlQuery.
*/
public function setDistributedJoins(bool $distributedJoins): SqlQuery
{
$this->distributedJoins = $distributedJoins;
return $this;
}
/**
* Set replicated only flag.
*
* @param bool $replicatedOnly replicated only flag: true or false.
*
* @return SqlQuery the same instance of the SqlQuery.
*/
public function setReplicatedOnly(bool $replicatedOnly): SqlQuery
{
$this->replicatedOnly = $replicatedOnly;
return $this;
}
/**
* Set timeout.
*
* @param float $timeout timeout value in milliseconds.
* Must be non-negative. Zero value disables timeout.
*
* @return SqlQuery the same instance of the SqlQuery.
*/
public function setTimeout(float $timeout): SqlQuery
{
$this->timeout = $timeout;
return $this;
}
protected function writeArgs(BinaryCommunicator $communicator, MessageBuffer $buffer): void
{
$argsLength = $this->args ? count($this->args) : 0;
$buffer->writeInteger($argsLength);
if ($argsLength > 0) {
for ($i = 0; $i < $argsLength; $i++) {
$argType = $this->argTypes && $i < count($this->argTypes) ? $this->argTypes[$i] : null;
$communicator->writeObject($buffer, $this->args[$i], $argType);
}
}
}
// 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->type);
BinaryCommunicator::writeString($buffer, $this->sql);
$this->writeArgs($communicator, $buffer);
$buffer->writeBoolean($this->distributedJoins);
$buffer->writeBoolean($this->local);
$buffer->writeBoolean($this->replicatedOnly);
$buffer->writeInteger($this->pageSize);
$buffer->writeLong($this->timeout);
}
// 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 Cursor($communicator, ClientOperation::QUERY_SQL_CURSOR_GET_PAGE, $payload, $keyType, $valueType);
$cursor->readId($payload);
return $cursor;
}
}