blob: 802f738f3ac3f5b9f8f497f0d3535f10e6557839 [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\Tests;
use Ds\Set;
use Apache\Ignite\Cache\CacheConfiguration;
use Apache\Ignite\Query\SqlFieldsQuery;
use PHPUnit\Framework\TestCase;
use Apache\Ignite\Type\ObjectType;
final class SqlFieldsQueryTestCase extends TestCase
{
const CACHE_NAME = '__php_test_sql_fields_query';
const ELEMENTS_NUMBER = 10;
const TABLE_NAME = '__php_test_SqlFieldsQuery_table';
private static $cache;
private static $selectFromTable;
public static function setUpBeforeClass(): void
{
TestingHelper::init();
self::cleanUp();
self::$cache = TestingHelper::$client->getOrCreateCache(
self::CACHE_NAME,
(new CacheConfiguration())->setSqlSchema('PUBLIC'));
self::generateData();
$tableName = self::TABLE_NAME;
self::$selectFromTable = "SELECT * FROM {$tableName}";
}
public static function tearDownAfterClass(): void
{
self::dropTables();
self::cleanUp();
TestingHelper::cleanUp();
}
public function testGetAll(): void
{
$cache = self::$cache;
$cursor = $cache->query(new SqlFieldsQuery(self::$selectFromTable));
$set = new Set();
foreach ($cursor->getAll() as $fields) {
$this->checkCursorResult($fields);
$set->add($fields[0]);
}
$this->assertEquals($set->count(), self::ELEMENTS_NUMBER);
}
public function testGetAllWithPageSizeLazyTrue(): void
{
$cache = self::$cache;
$cursor = $cache->query((new SqlFieldsQuery(self::$selectFromTable))->setPageSize(1)->setLazy(true));
$set = new Set();
foreach ($cursor->getAll() as $fields) {
$this->checkCursorResult($fields);
$set->add($fields[0]);
}
$this->assertEquals($set->count(), self::ELEMENTS_NUMBER);
}
public function testGetAllWithPageSizeLazyFalse(): void
{
$cache = self::$cache;
$cursor = $cache->query((new SqlFieldsQuery(self::$selectFromTable))->setPageSize(1)->setLazy(false));
$set = new Set();
foreach ($cursor->getAll() as $fields) {
$this->checkCursorResult($fields);
$set->add($fields[0]);
}
$this->assertEquals($set->count(), self::ELEMENTS_NUMBER);
}
public function testIterateCursor(): void
{
$cache = self::$cache;
$cursor = $cache->query(new SqlFieldsQuery(self::$selectFromTable));
$set = new Set();
foreach ($cursor as $fields) {
$this->checkCursorResult($fields);
$set->add($fields[0]);
}
$this->assertEquals($set->count(), self::ELEMENTS_NUMBER);
}
public function testIterateCursorWithPageSizeLazyTrue(): void
{
$cache = self::$cache;
$cursor = $cache->query((new SqlFieldsQuery(self::$selectFromTable))->setPageSize(2)->setLazy(true));
$set = new Set();
foreach ($cursor as $fields) {
$this->checkCursorResult($fields);
$set->add($fields[0]);
}
$this->assertEquals($set->count(), self::ELEMENTS_NUMBER);
}
public function testIterateCursorWithPageSizeLazyFalse(): void
{
$cache = self::$cache;
$cursor = $cache->query((new SqlFieldsQuery(self::$selectFromTable))->setPageSize(2)->setLazy(false));
$set = new Set();
foreach ($cursor as $fields) {
$this->checkCursorResult($fields);
$set->add($fields[0]);
}
$this->assertEquals($set->count(), self::ELEMENTS_NUMBER);
}
public function testCloseCursor(): void
{
$cache = self::$cache;
$cursor = $cache->query((new SqlFieldsQuery(self::$selectFromTable))->setPageSize(1));
$cursor->rewind();
$this->assertTrue($cursor->valid());
$this->checkCursorResult($cursor->current());
$cursor->next();
$cursor->close();
}
public function testCloseCursorAfterGetAll(): void
{
$cache = self::$cache;
$cursor = $cache->query(new SqlFieldsQuery(self::$selectFromTable));
$cursor->getAll();
$cursor->close();
$this->assertTrue(true);
}
public function testSqlFieldsQuerySettings(): void
{
$tableName = self::TABLE_NAME;
$cache = self::$cache;
$cursor = $cache->query((new SqlFieldsQuery(self::$selectFromTable))->
setPageSize(2)->
setLocal(false)->
setSql("INSERT INTO {$tableName} (field1, field2) VALUES (?, ?)")->
setArgTypes(ObjectType::INTEGER, ObjectType::STRING)->
setArgs(50, 'test')->
setDistributedJoins(true)->
setReplicatedOnly(false)->
setTimeout(10000)->
setSchema('PUBLIC')->
setMaxRows(20)->
setStatementType(SqlFieldsQuery::STATEMENT_TYPE_ANY)->
setEnforceJoinOrder(true)->
setCollocated(false)->
setLazy(true)->
setIncludeFieldNames(true));
$cursor->getAll();
$this->assertTrue(true);
}
public function testGetEmptyResults(): void
{
$tableName = self::TABLE_NAME;
$cache = self::$cache;
$cursor = $cache->query(new SqlFieldsQuery("SELECT * FROM {$tableName} WHERE field1 > 100"));
$entries = $cursor->getAll();
$this->assertEquals(count($entries), 0);
$cursor->close();
$cursor = $cache->query(new SqlFieldsQuery("SELECT * FROM {$tableName} WHERE field1 > 100"));
foreach ($cursor as $fields) {
$this->assertTrue(false);
}
$cursor->close();
}
private function checkCursorResult(array $fields): void
{
$this->assertEquals(count($fields), 2);
$this->assertEquals($fields[1], self::generateValue($fields[0]));
$this->assertTrue($fields[0] >= 0 && $fields[0] < self::ELEMENTS_NUMBER);
}
private static function dropTables(): void
{
$tableName = self::TABLE_NAME;
self::$cache->query(new SqlFieldsQuery("DROP TABLE {$tableName}"))->getAll();
}
private static function generateData(): void
{
$tableName = self::TABLE_NAME;
$cache = self::$cache;
$cache->query(new SqlFieldsQuery(
"CREATE TABLE IF NOT EXISTS {$tableName} (field1 INT, field2 VARCHAR, PRIMARY KEY (field1))"
))->getAll();
$insertQuery = (new SqlFieldsQuery("INSERT INTO {$tableName} (field1, field2) VALUES (?, ?)"))->
setArgTypes(ObjectType::INTEGER);
for ($i = 0; $i < self::ELEMENTS_NUMBER; $i++) {
$cache->query($insertQuery->setArgs($i, self::generateValue($i)))->getAll();
}
}
private static function generateValue(int $key): string
{
return 'value' . $key;
}
private static function cleanUp(): void
{
TestingHelper::destroyCache(self::CACHE_NAME);
}
}