/** * Create a query against a table matching one or more indices * * @param IndexedQuery $query * @param bool $use_cache * @return 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); }