Bravo3\Orm\Services\QueryManager::indexedQuery PHP Метод

indexedQuery() публичный Метод

Create a query against a table matching one or more indices
public indexedQuery ( IndexedQuery $query, boolean $use_cache = true ) : QueryResult
$query Bravo3\Orm\Query\IndexedQuery
$use_cache boolean
Результат Bravo3\Orm\Query\QueryResult
    public function indexedQuery(IndexedQuery $query, $use_cache = true)
    {
        $metadata = $this->getMapper()->getEntityMetadata($query->getClassName());
        $prefix = $this->getKeyScheme()->getEntityKey($metadata->getTableName(), '');
        $prefix_len = strlen($prefix);
        $master_list = null;
        foreach ($query->getIndices() as $index_name => $index_key) {
            if ($index_name == '@id') {
                $key = $this->getKeyScheme()->getEntityKey($metadata->getTableName(), $index_key);
                $set = $this->getDriver()->scan($key);
                $results = [];
                foreach ($set as $search_key) {
                    $results[] = substr($search_key, $prefix_len);
                }
            } else {
                $index = $metadata->getIndexByName($index_name);
                if (!$index) {
                    throw new InvalidArgumentException('Index "' . $index_name . '" does not exist on the entity');
                }
                $key = $this->getKeyScheme()->getIndexKey($index, $index_key);
                $set = $this->getDriver()->scan($key);
                $results = [];
                foreach ($set as $search_key) {
                    $results[] = $this->getDriver()->getSingleValueIndex($search_key);
                }
            }
            if ($master_list === null) {
                $master_list = $results;
            } else {
                $master_list = array_intersect($master_list, $results);
            }
        }
        return new QueryResult($this->entity_manager, $query, array_values($master_list), null, $use_cache);
    }