diff --git a/Annotation/Suggester/AbstractSuggesterProperty.php b/Annotation/Suggester/AbstractSuggesterProperty.php new file mode 100644 index 00000000..53affdfc --- /dev/null +++ b/Annotation/Suggester/AbstractSuggesterProperty.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Annotation\Suggester; + +/** + * Abstract class for various suggester annotations. + */ +abstract class AbstractSuggesterProperty +{ + /** + * @var string + */ + public $type = 'completion'; + + /** + * @var string + * + * @Required + */ + public $name; + + /** + * @var string + * + * @Required + */ + public $objectName; + + /** + * @var string + */ + public $index_analyzer; + + /** + * @var string + */ + public $search_analyzer; + + /** + * @var int + */ + public $preserve_separators; + + /** + * @var bool + */ + public $preserve_position_increments; + + /** + * @var int + */ + public $max_input_length; + + /** + * @var bool + */ + public $payloads; + + /** + * Returns required properties. + * + * @param array $extraExclude Extra object variables to exclude. + * + * @return array + */ + public function filter($extraExclude = []) + { + return array_diff_key( + array_filter(get_object_vars($this)), + array_flip(array_merge(['name', 'objectName', 'classObjectName'], $extraExclude)) + ); + } +} diff --git a/Annotation/Suggester/CompletionSuggesterProperty.php b/Annotation/Suggester/CompletionSuggesterProperty.php new file mode 100644 index 00000000..0fb2461a --- /dev/null +++ b/Annotation/Suggester/CompletionSuggesterProperty.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Annotation\Suggester; + +/** + * Class for completion suggester. + * + * @Annotation + * @Target("PROPERTY") + */ +class CompletionSuggesterProperty extends AbstractSuggesterProperty +{ +} diff --git a/Annotation/Suggester/Context/AbstractContext.php b/Annotation/Suggester/Context/AbstractContext.php new file mode 100644 index 00000000..0e5568e3 --- /dev/null +++ b/Annotation/Suggester/Context/AbstractContext.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Annotation\Suggester\Context; + +/** + * Abstract class for various context annotations. + */ +abstract class AbstractContext +{ + /** + * @var array + */ + public $default; + + /** + * @var string + * + * @Required + */ + public $name; + + /** + * @var string + */ + public $path; + + /** + * Returns context type. + * + * @return string + */ + abstract public function getType(); + + /** + * Returns filtered object data. + * + * @return array + */ + public function filter() + { + $vars = array_diff_key( + array_filter(get_object_vars($this)), + array_flip(['name']) + ); + + $vars['type'] = $this->getType(); + + return $vars; + } +} diff --git a/Annotation/Suggester/Context/CategoryContext.php b/Annotation/Suggester/Context/CategoryContext.php new file mode 100644 index 00000000..97e1dd1e --- /dev/null +++ b/Annotation/Suggester/Context/CategoryContext.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Annotation\Suggester\Context; + +/** + * Class for geo category context annotations used in context suggester. + * + * @Annotation + * @Target("ANNOTATION") + */ +class CategoryContext extends AbstractContext +{ + /** + * {@inheritdoc} + */ + public function getType() + { + return 'category'; + } +} diff --git a/Annotation/Suggester/Context/GeoLocationContext.php b/Annotation/Suggester/Context/GeoLocationContext.php new file mode 100644 index 00000000..5b7a966d --- /dev/null +++ b/Annotation/Suggester/Context/GeoLocationContext.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Annotation\Suggester\Context; + +/** + * Class for geo location context annotations used in context suggester. + * + * @Annotation + * @Target("ANNOTATION") + */ +class GeoLocationContext extends AbstractContext +{ + /** + * @var array + */ + public $precision; + + /** + * @var bool + */ + public $neighbors; + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'geo'; + } +} diff --git a/Annotation/Suggester/ContextSuggesterProperty.php b/Annotation/Suggester/ContextSuggesterProperty.php new file mode 100644 index 00000000..95d5f2ed --- /dev/null +++ b/Annotation/Suggester/ContextSuggesterProperty.php @@ -0,0 +1,34 @@ + + */ + public $context; + + /** + * {@inheritdoc} + */ + public function filter($extraExclude = []) + { + $data = parent::filter(['context']); + + /** @var AbstractContext $singleContext */ + foreach ($this->context as $singleContext) { + $data['context'][$singleContext->name] = $singleContext->filter(); + } + + return $data; + } +} diff --git a/DSL/Suggester/Context.php b/DSL/Suggester/Context.php new file mode 100644 index 00000000..06c16108 --- /dev/null +++ b/DSL/Suggester/Context.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\DSL\Suggester; + +use ONGR\ElasticsearchBundle\DSL\Suggester\Context\AbstractContext; + +/** + * Context suggester. + */ +class Context extends AbstractSuggester +{ + /** + * @var AbstractContext[] + */ + private $context; + + /** + * Size of completion. + * + * @var int + */ + private $size; + + /** + * Returns context. + * + * @return AbstractContext[] + */ + public function getContext() + { + return $this->context; + } + + /** + * Sets context array. + * + * @param AbstractContext[] $context + */ + public function setContext($context) + { + $this->context = $context; + } + + /** + * Sets context. + * + * @param AbstractContext $context + */ + public function addContext($context) + { + $this->context[] = $context; + } + + /** + * @return int + */ + public function getSize() + { + return $this->size; + } + + /** + * @param int $size + */ + public function setSize($size) + { + $this->size = $size; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + $completion = ['field' => $this->getField()]; + foreach ($this->context as $context) { + $completion['context'][$context->getName()] = $context->toArray(); + } + if ($this->getSize() !== null) { + $completion['size'] = $this->getSize(); + } + + return [ + $this->getName() => [ + 'text' => $this->getText(), + 'completion' => $completion, + ] + ]; + } + + /** + * {@inheritdoc} + */ + public function getType() + { + return 'completion'; + } +} diff --git a/DSL/Suggester/Context/AbstractContext.php b/DSL/Suggester/Context/AbstractContext.php new file mode 100644 index 00000000..f9f0a724 --- /dev/null +++ b/DSL/Suggester/Context/AbstractContext.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\DSL\Suggester\Context; + +/** + * Abstract context to be used by geo context and category context. + */ +abstract class AbstractContext +{ + /** + * Name of the context used. + * + * @var string + */ + private $name; + + /** + * Value of the context. + * + * @var string|array + */ + private $value; + + /** + * Constructor. + * + * @param string $name Context name. + * @param array|string $value Context value. + */ + public function __construct($name, $value) + { + $this->name = $name; + $this->value = $value; + } + + /** + * Converts context to an array. + * + * @return array + */ + abstract public function toArray(); + + /** + * Returns name of the context. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Sets type of the context. + * + * @param string $name + */ + public function setName($name) + { + $this->name = $name; + } + + /** + * @return array|string + */ + public function getValue() + { + return $this->value; + } + + /** + * @param array|string $value + */ + public function setValue($value) + { + $this->value = $value; + } +} diff --git a/DSL/Suggester/Context/CategoryContext.php b/DSL/Suggester/Context/CategoryContext.php new file mode 100644 index 00000000..51429cd3 --- /dev/null +++ b/DSL/Suggester/Context/CategoryContext.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\DSL\Suggester\Context; + +/** + * Category context to be used by context suggester. + */ +class CategoryContext extends AbstractContext +{ + /** + * {@inheritdoc} + */ + public function toArray() + { + return $this->getValue(); + } +} diff --git a/DSL/Suggester/Context/GeoContext.php b/DSL/Suggester/Context/GeoContext.php new file mode 100644 index 00000000..2d01eac1 --- /dev/null +++ b/DSL/Suggester/Context/GeoContext.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\DSL\Suggester\Context; + +/** + * Geo context to be used by context suggester. + */ +class GeoContext extends AbstractContext +{ + /** + * @var string + */ + private $precision; + + /** + * @return mixed + */ + public function getPrecision() + { + return $this->precision; + } + + /** + * @param mixed $precision + */ + public function setPrecision($precision) + { + $this->precision = $precision; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + $out = ['value' => $this->getValue()]; + + if ($this->getPrecision() !== null) { + $out['precision'] = $this->getPrecision(); + } + + return $out; + } +} diff --git a/Document/Suggester/CompletionSuggesterInterface.php b/Document/Suggester/CompletionSuggesterInterface.php new file mode 100644 index 00000000..79568849 --- /dev/null +++ b/Document/Suggester/CompletionSuggesterInterface.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Document\Suggester; + +/** + * Interface for completion suggester object. + */ +interface CompletionSuggesterInterface extends SuggesterInterface +{ +} diff --git a/Document/Suggester/CompletionSuggesterTrait.php b/Document/Suggester/CompletionSuggesterTrait.php new file mode 100644 index 00000000..dafdf5a5 --- /dev/null +++ b/Document/Suggester/CompletionSuggesterTrait.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Document\Suggester; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * Trait to be used for completion suggestion objects. + */ +trait CompletionSuggesterTrait +{ + use SuggesterTrait; +} diff --git a/Document/Suggester/ContextSuggesterInterface.php b/Document/Suggester/ContextSuggesterInterface.php new file mode 100644 index 00000000..4a4da362 --- /dev/null +++ b/Document/Suggester/ContextSuggesterInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Document\Suggester; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * Interface to be used for completion suggestion objects. + */ +interface ContextSuggesterInterface extends SuggesterInterface +{ + /** + * Returns context to be used for completion. + * + * @return object + */ + public function getContext(); + + /** + * Sets context to be used for completion. + * + * @param object $context + */ + public function setContext($context); +} diff --git a/Document/Suggester/ContextSuggesterTrait.php b/Document/Suggester/ContextSuggesterTrait.php new file mode 100644 index 00000000..9d071b87 --- /dev/null +++ b/Document/Suggester/ContextSuggesterTrait.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Document\Suggester; + +/** + * Class to be used for context suggestion objects. + */ +trait ContextSuggesterTrait +{ + use SuggesterTrait; + + /** + * Returns context to be used for completion. + * + * @return object + */ + public function getContext() + { + return $this->context; + } + + /** + * Sets context to be used for completion. + * + * @param object $context + */ + public function setContext($context) + { + $this->context = $context; + } +} diff --git a/Document/Suggester/SuggesterInterface.php b/Document/Suggester/SuggesterInterface.php new file mode 100644 index 00000000..28aea4ac --- /dev/null +++ b/Document/Suggester/SuggesterInterface.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Document\Suggester; + +/** + * Interface for a basic suggester. + */ +interface SuggesterInterface +{ + /** + * Setter for input to store. + * + * @param string $input + */ + public function setInput($input); + + /** + * Returns stored input. + * + * @return string|string[] + */ + public function getInput(); + + /** + * Setter for string to return. + * + * @param string $output + */ + public function setOutput($output); + + /** + * Returns output to be set. + * + * @return string + */ + public function getOutput(); + + /** + * Returns object to be returned in the suggest option. + * + * @return int|string + */ + public function getWeight(); + + /** + * Setter for a weight used to rank suggestions. + * + * @param int|string $weight + */ + public function setWeight($weight); + + /** + * Returns object to be returned in the suggest option. + * + * @return object + */ + public function getPayload(); + + /** + * Setter for object to be returned in the suggest option. + * + * @param object $payload + */ + public function setPayload($payload); +} diff --git a/Document/Suggester/SuggesterTrait.php b/Document/Suggester/SuggesterTrait.php new file mode 100644 index 00000000..dbc2f955 --- /dev/null +++ b/Document/Suggester/SuggesterTrait.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Document\Suggester; + +/** + * Abstract record document for various suggesters. + */ +trait SuggesterTrait +{ + /** + * Input to store. + * + * @var string[]|string + * + * @ES\Property(type="string", name="input") + */ + private $input; + + /** + * String to return. + * + * @var string + * + * @ES\Property(type="string", name="output") + */ + private $output; + + /** + * Object to be returned in the suggest option. + * + * @var object + * + * @ES\Property(type="object", name="payload") + */ + private $payload; + + /** + * Weight used to rank suggestions. + * + * @var int|string + * + * @ES\Property(type="string", name="weight") + */ + private $weight; + + /** + * Setter for input to store. + * + * @param string[]|string $input + */ + public function setInput($input) + { + $this->input = $input; + } + + /** + * Returns input to check for. + * + * @return string[] + */ + public function getInput() + { + return $this->input; + } + + /** + * Setter for string to return. + * + * @param string $output + */ + public function setOutput($output) + { + $this->output = $output; + } + + /** + * Returns output to be set. + * + * @return string + */ + public function getOutput() + { + return $this->output; + } + + /** + * Setter for object to be returned in the suggest option. + * + * @param object $payload + */ + public function setPayload($payload) + { + $this->payload = (object)$payload; + } + + /** + * Returns object to be returned in the suggest option. + * + * @return object + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Setter for a weight used to rank suggestions. + * + * @param int|string $weight + */ + public function setWeight($weight) + { + $this->weight = $weight; + } + + /** + * Returns object to be returned in the suggest option. + * + * @return int|string + */ + public function getWeight() + { + return $this->weight; + } +} diff --git a/Mapping/MappingTool.php b/Mapping/MappingTool.php index 337bdad9..772e9d4d 100644 --- a/Mapping/MappingTool.php +++ b/Mapping/MappingTool.php @@ -23,12 +23,22 @@ class MappingTool 'type' => 'object', '_routing' => ['required' => true], 'format' => 'dateOptionalTime', + 'max_input_length' => 50, + 'preserve_separators' => true, + 'preserve_position_increments' => true, + 'index_analyzer' => 'simple', + 'search_analyzer' => 'simple', + 'analyzer' => 'simple', + 'payloads' => false, ]; /** * @var array */ - private $formatFields = ['_ttl' => 'handleTime']; + protected $formatFields = [ + '_ttl' => 'handleTime', + 'precision' => 'handlePrecision', + ]; /** * @var array @@ -224,4 +234,18 @@ private function handleTime($value) return $value; } + + /** + * Handles precision. + * + * @param array|string $value + * + * @return array + */ + private function handlePrecision($value) + { + // TODO: currently precision is not checked. Issue #46. + + return []; + } } diff --git a/Mapping/MetadataCollector.php b/Mapping/MetadataCollector.php index 422667fc..99560158 100644 --- a/Mapping/MetadataCollector.php +++ b/Mapping/MetadataCollector.php @@ -17,6 +17,9 @@ use ONGR\ElasticsearchBundle\Annotation\Document; use ONGR\ElasticsearchBundle\Annotation\MultiField; use ONGR\ElasticsearchBundle\Annotation\Property; +use ONGR\ElasticsearchBundle\Annotation\Suggester\AbstractSuggesterProperty; +use ONGR\ElasticsearchBundle\Annotation\Suggester\CompletionSuggesterProperty; +use ONGR\ElasticsearchBundle\Annotation\Suggester\ContextSuggesterProperty; use ONGR\ElasticsearchBundle\Document\DocumentInterface; /** @@ -24,12 +27,16 @@ */ class MetadataCollector { + /** - * Annotations to load. - * - * @var array + * @const string + */ + const SUGGESTER_PROPERTY_ANNOTATION = 'ONGR\ElasticsearchBundle\Annotation\Suggester\AbstractSuggesterProperty'; + + /** + * @const string */ - protected $annotations = ['Document', 'Property', 'Object', 'Nested', 'MultiField']; + const PROPERTY_ANNOTATION = 'ONGR\ElasticsearchBundle\Annotation\Property'; /** * @var array @@ -62,6 +69,13 @@ class MetadataCollector */ private $aliases = []; + /** + * Contains suggester object mapping to be used for getters and setters. + * + * @var array + */ + private $suggesters = []; + /** * Directory in bundle to load documents from. * @@ -249,7 +263,7 @@ private function getDocumentType(\ReflectionClass $reflectionClass, Document $do /** * @param array $params Property parameters. - * @param array $alias Actual property name (not field name). + * @param string $alias Actual property name (not field name). * @param \ReflectionClass $reflectionClass Reflection class. * * @return array @@ -259,6 +273,13 @@ private function getInfoAboutProperty($params, $alias, $reflectionClass) $setter = $this->checkPropertyAccess($alias, 'set', $reflectionClass); $getter = $this->checkPropertyAccess($alias, 'get', $reflectionClass); + if ($params['type'] === 'completion') { + if (isset($this->suggesters[$reflectionClass->getName()][$alias])) { + $suggestionObjectNamespace = $this->suggesters[$reflectionClass->getName()][$alias]; + $params['properties'] = $this->objects[$suggestionObjectNamespace]['properties']; + } + } + if (isset($params['properties'])) { $data = $this->getInfoAboutPropertyObject($params['properties'], $alias, $reflectionClass); $setter['properties'] = $data['setter']; @@ -322,10 +343,7 @@ private function checkPropertyAccess($property, $methodPrefix, $reflectionClass) private function getInfoAboutPropertyObject($params, $propertyName, $reflectionClass) { /** @var Property $type */ - $type = $this->reader->getPropertyAnnotation( - $reflectionClass->getProperty($propertyName), - 'ONGR\ElasticsearchBundle\Annotation\Property' - ); + $type = $this->getPropertyAnnotationData($reflectionClass->getProperty($propertyName)); $childReflection = new \ReflectionClass($this->getNamespace($type->objectName)); @@ -343,7 +361,7 @@ private function getInfoAboutPropertyObject($params, $propertyName, $reflectionC 'setter' => $setters, 'getter' => $getters, 'namespace' => $this->getNamespace($type->objectName), - 'multiple' => $type->multiple, + 'multiple' => $type instanceof Property ? $type->multiple : false, ]; } @@ -397,41 +415,81 @@ private function getProperties(\ReflectionClass $reflectionClass) $mapping = []; /** @var \ReflectionProperty $property */ foreach ($reflectionClass->getProperties() as $property) { - /** @var Property $type */ - $type = $this->reader->getPropertyAnnotation($property, 'ONGR\ElasticsearchBundle\Annotation\Property'); - if (!empty($type)) { - $maps = $type->filter(); - $this->aliases[$reflectionClass->getName()][$type->name] = $property->getName(); - if (($type->type === 'object' || $type->type === 'nested') && !empty($type->objectName)) { - if (!empty($this->objects[strtolower($type->objectName)])) { - $objMap = $this->objects[strtolower($type->objectName)]; - } else { - $objMap = $this->getRelationMapping($type->objectName); - $this->objects[strtolower($type->objectName)] = $objMap; - } - $maps = array_replace_recursive($maps, $objMap); - } - if (isset($maps['fields']) && !in_array($type, ['object', 'nested'])) { - $fieldsMap = []; - /** @var MultiField $field */ - foreach ($maps['fields'] as $field) { - $fieldsMap[$field->name] = $field->filter(); - } - $maps['fields'] = $fieldsMap; + $type = $this->getPropertyAnnotationData($property); + + if (empty($type)) { + continue; + } + + $maps = $type->filter(); + $this->aliases[$reflectionClass->getName()][$type->name] = $property->getName(); + + // Object. + if (in_array($type->type, ['object', 'nested']) && !empty($type->objectName)) { + $maps = array_replace_recursive($maps, $this->getObjectMapping($type->objectName)); + } + + // MultiField. + if (isset($maps['fields']) && !in_array($type->type, ['object', 'nested'])) { + $fieldsMap = []; + /** @var MultiField $field */ + foreach ($maps['fields'] as $field) { + $fieldsMap[$field->name] = $field->filter(); } - $mapping[$type->name] = $maps; + $maps['fields'] = $fieldsMap; + } + + // Suggesters. + if ($type instanceof AbstractSuggesterProperty) { + $this->getObjectMapping($type->objectName); + $this->suggesters[$reflectionClass->getName()][$property->getName()] = strtolower($type->objectName); } + + $mapping[$type->name] = $maps; } return $mapping; } + /** + * Returns object mapping. + * + * Loads from cache if it's already loaded. + * + * @param string $objectName + * + * @return array + */ + private function getObjectMapping($objectName) + { + if (!empty($this->objects[strtolower($objectName)])) { + $objMap = $this->objects[strtolower($objectName)]; + } else { + $objMap = $this->getRelationMapping($objectName); + $this->objects[strtolower($objectName)] = $objMap; + } + + return $objMap; + } + /** * Registers annotations to registry so that it could be used by reader. */ private function registerAnnotations() { - foreach ($this->annotations as $annotation) { + $annotations = [ + 'Document', + 'Property', + 'Object', + 'Nested', + 'MultiField', + 'Suggester/CompletionSuggesterProperty', + 'Suggester/ContextSuggesterProperty', + 'Suggester/Context/CategoryContext', + 'Suggester/Context/GeoLocationContext', + ]; + + foreach ($annotations as $annotation) { AnnotationRegistry::registerFile(__DIR__ . "/../Annotation/{$annotation}.php"); } } @@ -471,4 +529,21 @@ private function getBundle($name) throw new \LogicException(sprintf('Bundle \'%s\' does not exist.', $name)); } + + /** + * Returns property annotation data. + * + * @param \ReflectionProperty $property + * + * @return AbstractSuggesterProperty|Property + */ + private function getPropertyAnnotationData($property) + { + $type = $this->reader->getPropertyAnnotation($property, self::PROPERTY_ANNOTATION); + if ($type === null) { + $type = $this->reader->getPropertyAnnotation($property, self::SUGGESTER_PROPERTY_ANNOTATION); + } + + return $type; + } } diff --git a/ORM/Manager.php b/ORM/Manager.php index 88aa50b2..e2952c62 100644 --- a/ORM/Manager.php +++ b/ORM/Manager.php @@ -164,6 +164,7 @@ private function convertToArray($object, $getters) $value = $newValue; } + if ($value instanceof \DateTime) { $value = $value->format(\DateTime::ISO8601); } diff --git a/ORM/Repository.php b/ORM/Repository.php index 2a2a6941..ae58fc9c 100644 --- a/ORM/Repository.php +++ b/ORM/Repository.php @@ -15,11 +15,14 @@ use ONGR\ElasticsearchBundle\DSL\Query\TermsQuery; use ONGR\ElasticsearchBundle\DSL\Search; use ONGR\ElasticsearchBundle\DSL\Sort\Sort; +use ONGR\ElasticsearchBundle\DSL\Suggester\AbstractSuggester; +use ONGR\ElasticsearchBundle\DSL\Suggester\Suggesters; use ONGR\ElasticsearchBundle\Result\Converter; use ONGR\ElasticsearchBundle\Result\DocumentIterator; use ONGR\ElasticsearchBundle\Result\DocumentScanIterator; use ONGR\ElasticsearchBundle\Result\RawResultIterator; use ONGR\ElasticsearchBundle\Result\RawResultScanIterator; +use ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionIterator; /** * Repository class. @@ -196,6 +199,30 @@ public function scan( return $this->parseResult($results, $resultsType, $scrollDuration); } + /** + * Get suggestions using suggest api. + * + * @param AbstractSuggester[]|AbstractSuggester $suggesters + * + * @return SuggestionIterator + */ + public function suggest($suggesters) + { + if (!is_array($suggesters)) { + $suggesters = [$suggesters]; + } + + $body = []; + /** @var AbstractSuggester $suggester */ + foreach ($suggesters as $suggester) { + $body = array_merge($suggester->toArray(), $body); + } + $results = $this->manager->getConnection()->getClient()->suggest(['body' => $body]); + unset($results['_shards']); + + return new SuggestionIterator($results); + } + /** * Removes a single document data by ID. * diff --git a/Resources/doc/suggesters/indexed_suggesters.md b/Resources/doc/suggesters/indexed_suggesters.md new file mode 100644 index 00000000..bb62df98 --- /dev/null +++ b/Resources/doc/suggesters/indexed_suggesters.md @@ -0,0 +1,221 @@ +# Indexed suggesters + +Indexed suggesters require special mapping and documented data to work, this includes two suggesters: completion and context. + +## Mapping + +### Completion +Starting with a more simple example, completion suggester. +Completion suggester is a simple field which you would just define in a document or an object using a special annotation for suggesters. +Available mapping parameters can be found [here][completion_mapping_parameters]. +For example: + +```php + Note context parameter name must be `context` in order for this mapping to work! + +```php + Note, that type doesn't matter here. + +```php +price = '500'; +$categoryContext->location = ['lat' => 50, 'lon' => 50]; +$suggester = new PriceLocationSuggesting(); +$suggester->setInput(['test']); +$suggester->setOutput('success'); +$suggester->setContext($categoryContext); +$suggester->setPayload(['test']); +$suggester->setWeight(50); + +$completionSuggester = new CompletionSuggesting(); +$completionSuggester->setInput(['a', 'b', 'c']); +$completionSuggester->setOutput('completion success'); +$completionSuggester->setWeight(30); + +$product = new Product(); +$product->contextSuggesting = $suggester; +$product->completionSuggesting = $completionSuggester; + +$manager->persist($product); +$manager->commit(); +``` + +To receive your data, search for it, just like you would with any other object. + +## Suggesting + +Once you have data and mapping, you can start looking for suggestions, it's just like with any other suggesters, an example: +```php + 0, 'lon' => 0]); +$categoryContext = new Context\CategoryContext('price', '500'); +$context = new Context('suggestions', 'cons'); +$context->addContext($geoContext); +$context->addContext($categoryContext); +$suggesters = [ + $context, + new Completion('completion_suggesting', 'ipsum'), +]; +$results = $repository->suggest($suggesters); +``` + +[completion_mapping_parameters]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#completion-suggester-mapping +[geo_mapping]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/suggester-context.html#_geo_location_mapping +[category_mapping]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/suggester-context.html#_category_mapping diff --git a/Resources/doc/suggesters/types.md b/Resources/doc/suggesters/types.md new file mode 100644 index 00000000..9edb88d6 --- /dev/null +++ b/Resources/doc/suggesters/types.md @@ -0,0 +1,57 @@ +# Sugggester types + +There are four basic types of suggesters objects to be used in a query and they have different parameters: + +* [Term][term_elastic], suggests terms based on edit distance. + +| Parameter | Description | Setter | +|-------------|-----------------------------------------------------------------|-----------------------| +| text | Text to search suggestions for. | constructor, setText | +| field | Field to look for suggesting on. This field is mandatory. | constructor, setField | +| analyzer | Analyzer to analyse to suggest text with. | setAnalyzer | +| size | Maximum corrections to be returned per suggest text token. | setSize | +| sort | Defines how suggestions should be sorted per suggest text term. | setSort | +| suggestMode | Controls what suggestions are included. | setSuggestMode | + +* [Phrase][phrase_elastic], basically a more complex term suggester. + +| Parameter | Description | Setter | +|-------------------------|---------------------------------------------------------------------------------------------------------------|----------------------------| +| text | Text to search suggestions for. | constructor, setText | +| field | Field to look for suggesting on. This field is mandatory. | constructor, setField | +| analyzer | Analyzer to analyse to suggest text with. | setAnalyzer | +| gramSize | Sets max size of the n-grams (shingles) in the field. | setGramSize | +| realWordErrorLikelihood | The likelihood of a term being a misspelled even if the term exists in the dictionary. | setRealWordErrorLikelihood | +| confidence | Defines a factor applied to the input phrases score. | setConfidence | +| maxErrors | The maximum percentage of the terms that at most considered to be misspellings in order to form a correction. | setMaxErrors | +| highlight | Setup highlighting. If provided must contain array with keys `pre_tag` and `post_tag`. | setHighlight | +| size | Maximum corrections to be returned per suggest text token. | setSize | + +* [Completion][completion_elastic], implements basic auto-complete functionality. Requires [special mapping](indexed_suggesters.md). + +| Parameter | Description | Setter | +|----------------|---------------------------------------------------------------------------|-----------------------| +| text | Text to search suggestions for. | constructor, setText | +| field | Field to look for suggesting on. This field is mandatory. | constructor, setField | +| useFuzzy | Whether or not to use fuzzy query. | useFuzzy | +| fuzziness | The fuzziness factor. | setFuzziness | +| transpositions | Sets if transpositions should be counted as one or two changes. | setTranspositions | +| minLength | Minimum length of the input before fuzzy suggestions are returned. | setMinLength | +| prefixLength | Minimum length of the input, which is not checked for fuzzy alternatives. | setPrefixLength | +| unicodeAware | Are measurements in unicde format. | setUnicodeAware | + +* [Context][context_elastic], implements auto-complete functionality based on context you provide. Requires [special mapping](indexed_suggesters.md). + +| Parameter | Description | Setter | +|-----------|------------------------------------------------------------|------------------------| +| text | Text to search suggestions for. | constructor, setText | +| field | Field to look for suggesting on. This field is mandatory. | constructor, setField | +| context | Context to look for. | addContext, setContext | +| size | Maximum corrections to be returned per suggest text token. | setSize | + +Every context is either geo context or category context, they both have value and name parameters, but geo context has an additional precision parameter. + +[phrase_elastic]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-phrase.html +[term_elastic]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-term.html +[completion_elastic]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-term.html +[context_elastic]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/suggester-context.html diff --git a/Resources/doc/suggesters/usage.md b/Resources/doc/suggesters/usage.md new file mode 100644 index 00000000..90a1590d --- /dev/null +++ b/Resources/doc/suggesters/usage.md @@ -0,0 +1,77 @@ +# Suggesters + +[Suggesters][suggesters_link] are used to find a similar looking term using the provided text. + +You can use suggesters in any query as you would normally, or [suggester api][suggesters_link]. + +There are basically four types of suggesters: terms, phrase, completion and context, to find out available parameters for these suggesters check out [this](types.md) section. + +>Completion and context suggesters need indexed data in order to work. To find out how to setup indexing and mapping, +check [indexed suggesters][indexed_suggesters] section. + +## Using suggesters in any query +Using suggesters with simple queries, i.e. `search` api is quite simple. +You can add suggesters just how you would add aggregations, filters, etc... +```php +getRepository('AcmeTestBundle:Product'); +$search = $repository->createSearch(); +$search->addQuery(new MatchAllQuery()); +$termSuggester = new Term('description', 'distibutd'); +$search->addSuggester($termSuggester); +$results = $repository->execute($search); +``` +That's it, getting the results is quite simple. +```php +getSuggestions(); +``` +To see how to use the suggestions iterator check out [this](#using-results) section. + +## Using suggesters with suggest api +```php +getRepository('AcmeTestBundle:Product'); +$termSuggester = new Term('description', 'distibutd'); +$phraseSuggester = new Phrase('description', 'distibuted'), +// You can pass an array of suggesters or a single suggester as well. +$suggestionsIterator = $repository->suggest([$termSuggester, $phraseSuggester]); +$suggestionsIterator2 = $repository->suggest($termSuggester); +``` + +## Using results +Once you have the suggestions iterator, you can get all the information needed from it. +Multiple suggestions have one or more suggestion entries based on your analyzer, and each suggestion entry may or may not have multiple options available. +To use this data, you can loop through the iterator, or just access the data you need using indexes. +```php +getText(); + $suggestionEntryOffset = $suggestionEntry->getOffset(); + $suggestionEntryLength = $suggestionEntry->getLength(); + foreach ($suggestionEntry->getOptions() as $option) { + $optionText = $option->getText(); + $optionScore = $option->getScore(); + } + } +} +$options = $suggestions['description-term'][0]->getOptions(); +``` + +>Note that based on ESB response, an option may be an instance of SimpleOption, CompletionOption, PhraseOption or TermOption. + +SimpleOption contains text and score data. +Each other type of option extends SimpleOption and stores additional data: + +| Option instance type | Additional parameter | Getter | +|----------------------|--------------------------------------------------|------------------| +| PhraseOption | `highlighted`, highlighted text | getHighlighted() | +| TermOption | `frequency`, suggested text document frequency | getFreq() | +| CompletionOption | `payload`, returns payload of a suggest document | getPayload() | + +> Note, just because you're using, for example, completion suggester, doesn't mean you'll get completion options, if payload was not set, you'll get a simple option instead. +Same goes for other options. + +[suggesters_link]:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters.html +[indexed_suggesters]:indexed_suggesters.md diff --git a/Resources/doc/usage.md b/Resources/doc/usage.md index 33010e6c..01996da1 100644 --- a/Resources/doc/usage.md +++ b/Resources/doc/usage.md @@ -78,3 +78,6 @@ $documents = $repository->findBy(['title' => 'Acme']); ```` To perform a more complex queries there is a Search DSL API. Read more about it in [Search DSL](search.md) chapter. + +### Autocomplete +To use autocomplete follow [suggesters](suggesters/usage.md) section. diff --git a/Result/Converter.php b/Result/Converter.php index 54e6b1c4..2c25164b 100644 --- a/Result/Converter.php +++ b/Result/Converter.php @@ -99,7 +99,7 @@ public function assignArrayToObject(array $array, $object, array $setters) } } - if ($setter['type'] === 'date') { + if (isset($setter['type']) && $setter['type'] === 'date') { $value = \DateTime::createFromFormat(\DateTime::ISO8601, $value); } diff --git a/Result/DocumentIterator.php b/Result/DocumentIterator.php index d16679d7..6824cb09 100644 --- a/Result/DocumentIterator.php +++ b/Result/DocumentIterator.php @@ -14,6 +14,7 @@ use ONGR\ElasticsearchBundle\Document\DocumentInterface; use ONGR\ElasticsearchBundle\DSL\Aggregation\Aggregations; use ONGR\ElasticsearchBundle\Result\Aggregation\AggregationIterator; +use ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionIterator; /** * This class is able to iterate over Elasticsearch result documents while casting data into models. @@ -41,7 +42,7 @@ class DocumentIterator extends AbstractResultsIterator private $aggregations; /** - * @var Suggestions + * @var SuggestionIterator */ private $suggestions; @@ -143,12 +144,12 @@ public function getAggregations() /** * Returns suggestions. * - * @return Suggestions + * @return SuggestionIterator */ public function getSuggestions() { if (isset($this->rawData['suggest'])) { - $this->suggestions = new Suggestions($this->rawData['suggest']); + $this->suggestions = new SuggestionIterator($this->rawData['suggest']); // Clear memory. unset($this->rawData['suggest']); diff --git a/Result/Suggestion/Option/CompletionOption.php b/Result/Suggestion/Option/CompletionOption.php new file mode 100644 index 00000000..f5c479b7 --- /dev/null +++ b/Result/Suggestion/Option/CompletionOption.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option; + +/** + * Data holder for completion option, used by context and completion suggesters. + */ +class CompletionOption extends SimpleOption +{ + /** + * @var array + */ + private $payload; + + /** + * Constructor. + * + * @param string $text + * @param float $score + * @param array $payload + */ + public function __construct($text, $score, $payload) + { + $this->payload = $payload; + parent::__construct($text, $score); + } + + /** + * Returns payload data. + * + * @return string + */ + public function getPayload() + { + return $this->payload; + } +} diff --git a/Result/Suggestion/Option/PhraseOption.php b/Result/Suggestion/Option/PhraseOption.php new file mode 100644 index 00000000..651b551a --- /dev/null +++ b/Result/Suggestion/Option/PhraseOption.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option; + +/** + * Data holder for phrase option. + */ +class PhraseOption extends SimpleOption +{ + /** + * @var string + */ + private $highlighted; + + /** + * Constructor. + * + * @param string $text + * @param float $score + * @param string $highlighted + */ + public function __construct($text, $score, $highlighted) + { + $this->highlighted = $highlighted; + parent::__construct($text, $score); + } + + /** + * Returns highlighted suggestion. + * + * @return string + */ + public function getHighlighted() + { + return $this->highlighted; + } +} diff --git a/Result/Suggestion/Option/SimpleOption.php b/Result/Suggestion/Option/SimpleOption.php new file mode 100644 index 00000000..2c4b051a --- /dev/null +++ b/Result/Suggestion/Option/SimpleOption.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Result\Suggestion\Option; + +/** + * Option data class. + */ +class SimpleOption +{ + /** + * @var string + */ + private $text; + + /** + * @var float + */ + private $score; + + /** + * Constructor. + * + * @param string $text + * @param float $score + */ + public function __construct($text, $score) + { + $this->score = $score; + $this->text = $text; + } + + /** + * Suggester score. + * + * @return float + */ + public function getScore() + { + return $this->score; + } + + /** + * Suggested text. + * + * @return string + */ + public function getText() + { + return $this->text; + } + + /** + * Sets option score. + * + * @param float $score + */ + public function setScore($score) + { + $this->score = $score; + } +} diff --git a/Result/Suggestion/Option/TermOption.php b/Result/Suggestion/Option/TermOption.php new file mode 100644 index 00000000..3717186d --- /dev/null +++ b/Result/Suggestion/Option/TermOption.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option; + +/** + * Data holder for term option. + */ +class TermOption extends SimpleOption +{ + /** + * @var int + */ + private $freq; + + /** + * Constructor. + * + * @param string $text + * @param float $score + * @param int $freq + */ + public function __construct($text, $score, $freq) + { + $this->freq = $freq; + parent::__construct($text, $score); + } + + /** + * Returns suggested text document frequency. + * + * @return int + */ + public function getFreq() + { + return $this->freq; + } +} diff --git a/Result/Suggestion/OptionIterator.php b/Result/Suggestion/OptionIterator.php new file mode 100644 index 00000000..88d7736f --- /dev/null +++ b/Result/Suggestion/OptionIterator.php @@ -0,0 +1,154 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Result\Suggestion; + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\CompletionOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\PhraseOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\SimpleOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\TermOption; + +/** + * Suggestions results holder. + */ +class OptionIterator implements \ArrayAccess, \Iterator +{ + /** + * @var array + */ + private $rawData = []; + + /** + * @var SimpleOption[] + */ + private $convertedData = []; + + /** + * Constructor. + * + * @param array $rawData + */ + public function __construct($rawData) + { + $this->rawData = $rawData; + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return isset($this->rawData[$offset]) || isset($this->convertedData[$offset]); + } + + /** + * Offset to retrieve. + * + * @param string|int $offset + * + * @return SimpleOption|null + */ + public function offsetGet($offset) + { + if (!$this->offsetExists($offset)) { + return null; + } + + if (!isset($this->convertedData[$offset])) { + $this->convertedData[$offset] = $this->convert($this->rawData[$offset]); + $this->rawData[$offset] = null; + } + + return $this->convertedData[$offset]; + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) + { + throw new \LogicException('Data of this iterator can not be changed after initialization.'); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + throw new \LogicException('Data of this iterator can not be changed after initialization.'); + } + + // Methods below implements \Iterator interface. + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->offsetGet($this->key()); + } + + /** + * {@inheritdoc} + */ + public function next() + { + next($this->rawData); + } + + /** + * {@inheritdoc} + */ + public function key() + { + return key($this->rawData); + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->key() !== null; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + reset($this->rawData); + } + + /** + * Converts array to a array of suggestion objects. + * + * @param array $data + * + * @return SimpleOption + */ + private function convert($data) + { + if (isset($data['freq'])) { + return new TermOption($data['text'], $data['score'], $data['freq']); + } + + if (isset($data['highlighted'])) { + return new PhraseOption($data['text'], $data['score'], $data['highlighted']); + } + + if (isset($data['payload'])) { + return new CompletionOption($data['text'], $data['score'], $data['payload']); + } + + return new SimpleOption($data['text'], $data['score']); + } +} diff --git a/Result/Suggestion/SuggestionEntry.php b/Result/Suggestion/SuggestionEntry.php new file mode 100644 index 00000000..ce18551c --- /dev/null +++ b/Result/Suggestion/SuggestionEntry.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Result\Suggestion; + +/** + * Suggestions results holder. + */ +class SuggestionEntry +{ + /** + * @var OptionIterator + */ + private $options; + + /** + * @var string + */ + private $text; + + /** + * @var int + */ + private $offset; + + /** + * @var int + */ + private $length; + + /** + * Constructor. + * + * @param string $text + * @param int $offset + * @param int $length + * @param OptionIterator $options + */ + public function __construct($text, $offset, $length, OptionIterator $options) + { + $this->text = $text; + $this->offset = $offset; + $this->length = $length; + $this->options = $options; + } + + /** + * Return original length. + * + * @return int + */ + public function getLength() + { + return $this->length; + } + + /** + * Returns original start offset. + * + * @return int + */ + public function getOffset() + { + return $this->offset; + } + + /** + * Returns original text. + * + * @return string + */ + public function getText() + { + return $this->text; + } + + /** + * Returns suggested options. + * + * @return OptionIterator + */ + public function getOptions() + { + return $this->options; + } +} diff --git a/Result/Suggestion/SuggestionIterator.php b/Result/Suggestion/SuggestionIterator.php new file mode 100644 index 00000000..be7b9cc3 --- /dev/null +++ b/Result/Suggestion/SuggestionIterator.php @@ -0,0 +1,147 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Result\Suggestion; + +/** + * Suggestions results holder. + */ +class SuggestionIterator implements \ArrayAccess, \Iterator +{ + /** + * @var array + */ + private $rawData = []; + + /** + * @var SuggestionEntry[] + */ + private $convertedData = []; + + /** + * Constructor. + * + * @param array $rawData + */ + public function __construct($rawData) + { + $this->rawData = $rawData; + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return isset($this->rawData[$offset]) || isset($this->convertedData[$offset]); + } + + /** + * Offset to retrieve. + * + * @param string|int $offset + * + * @return SuggestionEntry[]|null + */ + public function offsetGet($offset) + { + if (!$this->offsetExists($offset)) { + return null; + } + + if (!isset($this->convertedData[$offset])) { + $this->convertedData[$offset] = $this->convert($this->rawData[$offset]); + $this->rawData[$offset] = null; + } + + return $this->convertedData[$offset]; + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) + { + throw new \LogicException('Data of this iterator can not be changed after initialization.'); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + throw new \LogicException('Data of this iterator can not be changed after initialization.'); + } + + // Methods below implements \Iterator interface. + + /** + * {@inheritdoc} + */ + public function current() + { + return $this->offsetGet($this->key()); + } + + /** + * {@inheritdoc} + */ + public function next() + { + next($this->rawData); + } + + /** + * {@inheritdoc} + */ + public function key() + { + return key($this->rawData); + } + + /** + * {@inheritdoc} + */ + public function valid() + { + return $this->key() !== null; + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + reset($this->rawData); + } + + /** + * Converts array to a array of suggestion objects. + * + * @param array $data + * + * @return SuggestionEntry[] + */ + private function convert($data) + { + $out = []; + foreach ($data as $entry) { + $out[] = new SuggestionEntry( + $entry['text'], + $entry['offset'], + $entry['length'], + new OptionIterator($entry['options']) + ); + } + + return $out; + } +} diff --git a/Result/Suggestions.php b/Result/Suggestions.php deleted file mode 100644 index 373aee0e..00000000 --- a/Result/Suggestions.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace ONGR\ElasticsearchBundle\Result; - -/** - * Suggestions results holder. - */ -class Suggestions implements \ArrayAccess -{ - /** - * @var array - */ - private $rawData; - - /** - * Constructor. - * - * @param array $rawData - */ - public function __construct($rawData) - { - $this->rawData = $rawData; - } - - /** - * {@inheritdoc} - */ - public function offsetExists($offset) - { - return isset($this->rawData[$offset]); - } - - /** - * {@inheritdoc} - */ - public function offsetGet($offset) - { - if (!$this->offsetExists($offset)) { - return null; - } - - return $this->rawData[$offset]; - } - - /** - * {@inheritdoc} - */ - public function offsetSet($offset, $value) - { - throw new \LogicException('Data of this iterator can not be changed after initialization.'); - } - - /** - * {@inheritdoc} - */ - public function offsetUnset($offset) - { - throw new \LogicException('Data of this iterator can not be changed after initialization.'); - } -} diff --git a/Tests/Functional/Client/ConnectionTest.php b/Tests/Functional/Client/ConnectionTest.php index d21c4c2b..a1e36d23 100644 --- a/Tests/Functional/Client/ConnectionTest.php +++ b/Tests/Functional/Client/ConnectionTest.php @@ -67,7 +67,7 @@ public function testBulk() { $manager = $this->getManager(); $connection = $manager->getConnection(); - $repository = $manager->getRepository('ONGRTestingBundle:Product'); + $repository = $manager->getRepository('AcmeTestBundle:Product'); // CREATE. $connection->bulk('create', 'product', ['_id' => 'baz', 'title' => 'Awesomo']); diff --git a/Tests/Functional/Command/IndexImportCommandTest.php b/Tests/Functional/Command/IndexImportCommandTest.php index 04449eda..3fe93b11 100644 --- a/Tests/Functional/Command/IndexImportCommandTest.php +++ b/Tests/Functional/Command/IndexImportCommandTest.php @@ -39,7 +39,7 @@ public function testIndexImport() ); $manager = $this->getManager('default', false); - $repo = $manager->getRepository('ONGRTestingBundle:Product'); + $repo = $manager->getRepository('AcmeTestBundle:Product'); $search = $repo ->createSearch() ->addQuery(new MatchAllQuery()); diff --git a/Tests/Functional/Command/TypeUpdateCommandTest.php b/Tests/Functional/Command/TypeUpdateCommandTest.php index 6c10eb34..c557ab44 100644 --- a/Tests/Functional/Command/TypeUpdateCommandTest.php +++ b/Tests/Functional/Command/TypeUpdateCommandTest.php @@ -60,7 +60,7 @@ public function setUp() $this->manager = $this->container->get('es.manager'); // Set up custom document to test mapping with. - $this->documentDir = $this->container->get('kernel')->locateResource('@ONGRTestingBundle/Document/'); + $this->documentDir = $this->container->get('kernel')->locateResource('@AcmeTestBundle/Document/'); $this->file = $this->documentDir . 'Article.php'; // Create index for testing. diff --git a/Tests/Functional/DSL/Aggregation/FilterAggregationTest.php b/Tests/Functional/DSL/Aggregation/FilterAggregationTest.php index 77d5dc5c..20cfb49a 100644 --- a/Tests/Functional/DSL/Aggregation/FilterAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/FilterAggregationTest.php @@ -107,7 +107,7 @@ public function getFilterAggregationData() public function testFilterAggregation($aggregation, $expectedResults) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch()->addAggregation($aggregation); diff --git a/Tests/Functional/DSL/Aggregation/GlobalAggregationTest.php b/Tests/Functional/DSL/Aggregation/GlobalAggregationTest.php index 4bac5284..2081c2f4 100644 --- a/Tests/Functional/DSL/Aggregation/GlobalAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/GlobalAggregationTest.php @@ -115,7 +115,7 @@ public function getGlobalAggregationData() public function testGlobalAggregation($aggregation, $query, $expectedResults, $hitsCount) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch()->addAggregation($aggregation); if ($query) { diff --git a/Tests/Functional/DSL/Aggregation/NestedAggregationTest.php b/Tests/Functional/DSL/Aggregation/NestedAggregationTest.php index a50ddaa9..f664e56e 100644 --- a/Tests/Functional/DSL/Aggregation/NestedAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/NestedAggregationTest.php @@ -161,7 +161,7 @@ public function getNestedAggregationData() public function testNestedAggregation($aggregation, $expectedResult, $mapping) { /** @var Repository $repo */ - $repo = $this->getManager('default', true, $mapping)->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager('default', true, $mapping)->getRepository('AcmeTestBundle:Product'); $nestedAggregation = new NestedAggregation('test_nested_agg'); $nestedAggregation->setPath('sub_products'); diff --git a/Tests/Functional/DSL/Aggregation/RangeAggregationTest.php b/Tests/Functional/DSL/Aggregation/RangeAggregationTest.php index 81f4f756..f399c9a9 100644 --- a/Tests/Functional/DSL/Aggregation/RangeAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/RangeAggregationTest.php @@ -147,7 +147,7 @@ public function getRangeAggregationData() public function testRangeAggregation($aggregation, $expectedResult) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $rangeAggregation = new RangeAggregation($aggregation['name']); $rangeAggregation->setField($aggregation['field']); diff --git a/Tests/Functional/DSL/Aggregation/StatsAggregationTest.php b/Tests/Functional/DSL/Aggregation/StatsAggregationTest.php index a6325412..eb102516 100644 --- a/Tests/Functional/DSL/Aggregation/StatsAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/StatsAggregationTest.php @@ -51,7 +51,7 @@ protected function getDataArray() public function testStatsAggregation() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $aggregation = new StatsAggregation('test_agg'); $aggregation->setField('price'); diff --git a/Tests/Functional/DSL/Aggregation/TermsAggregationTest.php b/Tests/Functional/DSL/Aggregation/TermsAggregationTest.php index 1bb55cdf..f8d5bef1 100644 --- a/Tests/Functional/DSL/Aggregation/TermsAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/TermsAggregationTest.php @@ -246,7 +246,7 @@ public function getTermsAggregationDataWithRangeQuery() public function testTermsAggregation($aggregation, $expectedResult) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch()->addAggregation($aggregation); $results = $repo->execute($search, Repository::RESULTS_RAW); @@ -266,7 +266,7 @@ public function testTermsAggregation($aggregation, $expectedResult) public function testTermsAggregationWithRangeQuery($aggregation, $parameters, $expectedResult) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $rangeQuery = new RangeQuery('price', $parameters); diff --git a/Tests/Functional/DSL/Aggregation/TopHitsAggregationTest.php b/Tests/Functional/DSL/Aggregation/TopHitsAggregationTest.php index 13761cfc..ca576aae 100644 --- a/Tests/Functional/DSL/Aggregation/TopHitsAggregationTest.php +++ b/Tests/Functional/DSL/Aggregation/TopHitsAggregationTest.php @@ -114,7 +114,7 @@ public function getTopHitsAggregationData() public function testTopHitsAggregation(AbstractAggregation $aggregation, $expectedHits) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $functions = [ 'script_score' => ['script' => "doc['price'].value"] ]; @@ -143,7 +143,7 @@ public function testTopHitsAggregation(AbstractAggregation $aggregation, $expect public function testTopHitsAggregationUsingGetter(AbstractAggregation $aggregation, $expectedHits) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $functions = [ 'script_score' => ['script' => "doc['price'].value"] ]; @@ -176,7 +176,7 @@ public function testTopHitsAggregationNested() $termAggregation->aggregations->addAggregation($topAggregation); /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch()->addAggregation($termAggregation)->addSort(new Sort('_id', Sort::ORDER_ASC)); $results = $repo->execute($search, Repository::RESULTS_RAW); diff --git a/Tests/Functional/DSL/Complex/BoolTestWithFuzzyQueryAndSortFilterTest.php b/Tests/Functional/DSL/Complex/BoolTestWithFuzzyQueryAndSortFilterTest.php index e24caae4..719d9f70 100644 --- a/Tests/Functional/DSL/Complex/BoolTestWithFuzzyQueryAndSortFilterTest.php +++ b/Tests/Functional/DSL/Complex/BoolTestWithFuzzyQueryAndSortFilterTest.php @@ -135,7 +135,7 @@ public function getTestBoolWithFuzzyQueryAndSortFilterData() public function testBoolWithFuzzyQueryAndSortFilter($field, $value, $parameters, $sort_field, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $FuzzyQuery = new FuzzyQuery($field, $value, $parameters); $SortFilter = new Sort($sort_field); $search = $repo->createSearch()->addQuery($FuzzyQuery); diff --git a/Tests/Functional/DSL/Complex/BoolTestWithMatchQueryAndLimitFilterTest.php b/Tests/Functional/DSL/Complex/BoolTestWithMatchQueryAndLimitFilterTest.php index 218ce5f2..293086f0 100644 --- a/Tests/Functional/DSL/Complex/BoolTestWithMatchQueryAndLimitFilterTest.php +++ b/Tests/Functional/DSL/Complex/BoolTestWithMatchQueryAndLimitFilterTest.php @@ -109,7 +109,7 @@ public function getTestBoolTestWithMatchQueryAndLimitFilterData() public function testBoolWithMatchQueryAndLimitFilter($query, $limit, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $matchQuery = new MatchQuery($query, 'description'); $limitFilter = new LimitFilter($limit); $search = $repo->createSearch()->addQuery($matchQuery); diff --git a/Tests/Functional/DSL/Complex/PostFilterAndAggregationTest.php b/Tests/Functional/DSL/Complex/PostFilterAndAggregationTest.php index df479bee..d4f7703c 100644 --- a/Tests/Functional/DSL/Complex/PostFilterAndAggregationTest.php +++ b/Tests/Functional/DSL/Complex/PostFilterAndAggregationTest.php @@ -73,7 +73,7 @@ protected function getDataArray() */ public function testBoolWithFuzzyQueryAndSortFilter() { - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch(); $rangeFilter = new RangeFilter('price', ['from' => 200, 'to' => 999]); diff --git a/Tests/Functional/DSL/Filter/AndFilterTest.php b/Tests/Functional/DSL/Filter/AndFilterTest.php index 937ad0b3..90127610 100644 --- a/Tests/Functional/DSL/Filter/AndFilterTest.php +++ b/Tests/Functional/DSL/Filter/AndFilterTest.php @@ -108,7 +108,7 @@ public function getAndFilterData() public function testAndFilter($prefixField, $prefixValue, $missingField, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $missing = new MissingFilter($missingField); $prefix = new PrefixFilter($prefixField, $prefixValue); diff --git a/Tests/Functional/DSL/Filter/BoolFilterTest.php b/Tests/Functional/DSL/Filter/BoolFilterTest.php index 179744b7..ac070390 100644 --- a/Tests/Functional/DSL/Filter/BoolFilterTest.php +++ b/Tests/Functional/DSL/Filter/BoolFilterTest.php @@ -100,7 +100,7 @@ public function getBoolFilterData() public function testBoolFilter($mustFilter, $mustNotFilter, $shouldFilter, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); /** @var Search $search */ $search = $repo->createSearch()->addFilter($mustFilter, 'must'); $search->addFilter($mustNotFilter, 'must_not'); diff --git a/Tests/Functional/DSL/Filter/ExistsFilterTest.php b/Tests/Functional/DSL/Filter/ExistsFilterTest.php index fab25e15..c0f7bd2e 100644 --- a/Tests/Functional/DSL/Filter/ExistsFilterTest.php +++ b/Tests/Functional/DSL/Filter/ExistsFilterTest.php @@ -45,7 +45,7 @@ protected function getDataArray() public function testExistsFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $exists = new ExistsFilter('field', 'price'); $search = $repo->createSearch()->addFilter($exists); diff --git a/Tests/Functional/DSL/Filter/IdsFilterTest.php b/Tests/Functional/DSL/Filter/IdsFilterTest.php index 8cab2030..2e260b0e 100644 --- a/Tests/Functional/DSL/Filter/IdsFilterTest.php +++ b/Tests/Functional/DSL/Filter/IdsFilterTest.php @@ -109,7 +109,7 @@ public function getIdsFilterData() public function testIdsFilter($values, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $ids = new IdsFilter($values, $parameters); $search = $repo->createSearch()->addFilter($ids); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/Filter/IndicesFilterTest.php b/Tests/Functional/DSL/Filter/IndicesFilterTest.php index 96259cb8..7a798730 100644 --- a/Tests/Functional/DSL/Filter/IndicesFilterTest.php +++ b/Tests/Functional/DSL/Filter/IndicesFilterTest.php @@ -92,7 +92,7 @@ public function getIndicesFilterData() public function testIndicesFilter($filterParams, $noMatchFilterParams, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $filter = new PrefixFilter($filterParams[0], $filterParams[1]); if (is_string($noMatchFilterParams)) { diff --git a/Tests/Functional/DSL/Filter/LimitFilterTest.php b/Tests/Functional/DSL/Filter/LimitFilterTest.php index e721311e..9ffbb625 100644 --- a/Tests/Functional/DSL/Filter/LimitFilterTest.php +++ b/Tests/Functional/DSL/Filter/LimitFilterTest.php @@ -46,7 +46,7 @@ protected function getDataArray() public function testLimitFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $limit = new LimitFilter(1); $search = $repo->createSearch()->addFilter($limit); diff --git a/Tests/Functional/DSL/Filter/MatchAllFilterTest.php b/Tests/Functional/DSL/Filter/MatchAllFilterTest.php index a2b45217..f9b5bfb3 100644 --- a/Tests/Functional/DSL/Filter/MatchAllFilterTest.php +++ b/Tests/Functional/DSL/Filter/MatchAllFilterTest.php @@ -40,7 +40,7 @@ protected function getDataArray() public function testMatchAllFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $matchAll = new MatchAllFilter(); $search = $repo->createSearch()->addFilter($matchAll); diff --git a/Tests/Functional/DSL/Filter/MissingFilterTest.php b/Tests/Functional/DSL/Filter/MissingFilterTest.php index 0db83a6c..2255cf4a 100644 --- a/Tests/Functional/DSL/Filter/MissingFilterTest.php +++ b/Tests/Functional/DSL/Filter/MissingFilterTest.php @@ -45,7 +45,7 @@ protected function getDataArray() public function testMissingFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $missing = new MissingFilter('price'); $search = $repo->createSearch()->addFilter($missing); diff --git a/Tests/Functional/DSL/Filter/NotFilterTest.php b/Tests/Functional/DSL/Filter/NotFilterTest.php index 46fa7178..1d067d22 100644 --- a/Tests/Functional/DSL/Filter/NotFilterTest.php +++ b/Tests/Functional/DSL/Filter/NotFilterTest.php @@ -89,7 +89,7 @@ public function getNotFilterData() public function testNotFilter($missingField, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $missing = new MissingFilter($missingField); $not = new NotFilter($missing, $parameters); $search = $repo->createSearch()->addFilter($not); diff --git a/Tests/Functional/DSL/Filter/OrFilterTest.php b/Tests/Functional/DSL/Filter/OrFilterTest.php index e1b34c6b..b4ab6dcc 100644 --- a/Tests/Functional/DSL/Filter/OrFilterTest.php +++ b/Tests/Functional/DSL/Filter/OrFilterTest.php @@ -108,7 +108,7 @@ public function getOrFilterData() public function testOrFilter($termFieldOne, $termValueOne, $termFieldTwo, $termValueTwo, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $filters = [ new TermFilter($termFieldOne, $termValueOne), diff --git a/Tests/Functional/DSL/Filter/PrefixFilterTest.php b/Tests/Functional/DSL/Filter/PrefixFilterTest.php index 71800607..4e99d3f8 100644 --- a/Tests/Functional/DSL/Filter/PrefixFilterTest.php +++ b/Tests/Functional/DSL/Filter/PrefixFilterTest.php @@ -45,7 +45,7 @@ protected function getDataArray() public function testPrefixFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $prefix = new PrefixFilter('title', 'f', ['_cache' => true]); $search = $repo->createSearch()->addFilter($prefix); diff --git a/Tests/Functional/DSL/Filter/QueryFilterTest.php b/Tests/Functional/DSL/Filter/QueryFilterTest.php index 24125b9b..38652498 100644 --- a/Tests/Functional/DSL/Filter/QueryFilterTest.php +++ b/Tests/Functional/DSL/Filter/QueryFilterTest.php @@ -90,7 +90,7 @@ public function getQueryFilterData() public function testQueryFilter($query, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $not = new QueryFilter($query, $parameters); $search = $repo->createSearch()->addFilter($not); diff --git a/Tests/Functional/DSL/Filter/RangeFilterTest.php b/Tests/Functional/DSL/Filter/RangeFilterTest.php index 60f00f80..de7b8455 100644 --- a/Tests/Functional/DSL/Filter/RangeFilterTest.php +++ b/Tests/Functional/DSL/Filter/RangeFilterTest.php @@ -51,7 +51,7 @@ protected function getDataArray() public function testRangeFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $range = new RangeFilter('price', ['from' => 50, 'to' => 80]); $search = $repo->createSearch()->addFilter($range); diff --git a/Tests/Functional/DSL/Filter/RegexpFilterTest.php b/Tests/Functional/DSL/Filter/RegexpFilterTest.php index 5bd3d78a..a55ebf24 100644 --- a/Tests/Functional/DSL/Filter/RegexpFilterTest.php +++ b/Tests/Functional/DSL/Filter/RegexpFilterTest.php @@ -117,7 +117,7 @@ public function getRegexpFilterData() public function testRegexpFilter($field, $regexp, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $regexp = new RegexpFilter($field, $regexp, $parameters); $search = $repo->createSearch()->addFilter($regexp); diff --git a/Tests/Functional/DSL/Filter/ScriptFilterTest.php b/Tests/Functional/DSL/Filter/ScriptFilterTest.php index 38a67ca0..d465d797 100644 --- a/Tests/Functional/DSL/Filter/ScriptFilterTest.php +++ b/Tests/Functional/DSL/Filter/ScriptFilterTest.php @@ -98,7 +98,7 @@ public function getScriptFilterData() public function testScriptFilter($script, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $script = new ScriptFilter($script, $parameters); $search = $repo->createSearch()->addFilter($script); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/Filter/TermFilterTest.php b/Tests/Functional/DSL/Filter/TermFilterTest.php index 0fbf5843..09ff9db8 100644 --- a/Tests/Functional/DSL/Filter/TermFilterTest.php +++ b/Tests/Functional/DSL/Filter/TermFilterTest.php @@ -51,7 +51,7 @@ protected function getDataArray() public function testTermFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $field = 'user'; $term = 'zoo'; diff --git a/Tests/Functional/DSL/Filter/TermsFilterTest.php b/Tests/Functional/DSL/Filter/TermsFilterTest.php index 4c02be69..dcef648c 100644 --- a/Tests/Functional/DSL/Filter/TermsFilterTest.php +++ b/Tests/Functional/DSL/Filter/TermsFilterTest.php @@ -51,7 +51,7 @@ protected function getDataArray() public function testTermsFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $field = 'user'; $terms = [ diff --git a/Tests/Functional/DSL/Filter/TypeFilterTest.php b/Tests/Functional/DSL/Filter/TypeFilterTest.php index 7a39118d..763dae66 100644 --- a/Tests/Functional/DSL/Filter/TypeFilterTest.php +++ b/Tests/Functional/DSL/Filter/TypeFilterTest.php @@ -51,7 +51,7 @@ protected function getDataArray() public function testTypeFilter() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $type = new TypeFilter('product'); $search = $repo->createSearch()->addFilter($type); diff --git a/Tests/Functional/DSL/Highlight/FieldTest.php b/Tests/Functional/DSL/Highlight/FieldTest.php index 9add8793..81e881de 100644 --- a/Tests/Functional/DSL/Highlight/FieldTest.php +++ b/Tests/Functional/DSL/Highlight/FieldTest.php @@ -57,7 +57,7 @@ protected function getDataArray() public function testHighlightedField() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new TermQuery('title', 'foo'); @@ -96,7 +96,7 @@ public function testHighlightedField() public function testFieldHighlightQuery() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new TermQuery('title', 'foo'); @@ -123,7 +123,7 @@ public function testFieldHighlightQuery() public function testNoMatchSize() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new TermQuery('description', 'description'); diff --git a/Tests/Functional/DSL/Highlight/HighlightTest.php b/Tests/Functional/DSL/Highlight/HighlightTest.php index 724a6161..ac831a99 100644 --- a/Tests/Functional/DSL/Highlight/HighlightTest.php +++ b/Tests/Functional/DSL/Highlight/HighlightTest.php @@ -16,7 +16,7 @@ use ONGR\ElasticsearchBundle\DSL\Query\TermQuery; use ONGR\ElasticsearchBundle\ORM\Repository; use ONGR\ElasticsearchBundle\Test\ElasticsearchTestCase; -use ONGR\TestingBundle\Document\Product; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product; /** * Highlighting functional test @@ -176,7 +176,7 @@ public function testHighlightParse() */ private function buildRepositoryAndTerm() { - $repository = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repository = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new TermQuery('title', 'foo'); diff --git a/Tests/Functional/DSL/Query/CommonTermsTest.php b/Tests/Functional/DSL/Query/CommonTermsTest.php index 369a3015..a329f830 100644 --- a/Tests/Functional/DSL/Query/CommonTermsTest.php +++ b/Tests/Functional/DSL/Query/CommonTermsTest.php @@ -104,7 +104,7 @@ public function getTestCommonTermsQueryData() public function testCommonTermsQuery($query, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $commonTermsQuery = new CommonTermsQuery('description', $query, $parameters); diff --git a/Tests/Functional/DSL/Query/ConstantScoreTest.php b/Tests/Functional/DSL/Query/ConstantScoreTest.php index 10336939..81b4ce48 100644 --- a/Tests/Functional/DSL/Query/ConstantScoreTest.php +++ b/Tests/Functional/DSL/Query/ConstantScoreTest.php @@ -50,7 +50,7 @@ protected function getDataArray() public function testConstantScoreQuery() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $constantScoreQuery = new ConstantScoreQuery(new MatchAllQuery()); diff --git a/Tests/Functional/DSL/Query/FunctionScoreQueryTest.php b/Tests/Functional/DSL/Query/FunctionScoreQueryTest.php index 0e61830b..bf772970 100644 --- a/Tests/Functional/DSL/Query/FunctionScoreQueryTest.php +++ b/Tests/Functional/DSL/Query/FunctionScoreQueryTest.php @@ -60,7 +60,7 @@ protected function getDataArray() public function testFunctionScoreQuery() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $functions = [ 'field_value_factor' => [ diff --git a/Tests/Functional/DSL/Query/FuzzyLikeThisFieldTest.php b/Tests/Functional/DSL/Query/FuzzyLikeThisFieldTest.php index c44a0aea..cef08204 100644 --- a/Tests/Functional/DSL/Query/FuzzyLikeThisFieldTest.php +++ b/Tests/Functional/DSL/Query/FuzzyLikeThisFieldTest.php @@ -99,7 +99,7 @@ public function getTestFuzzyLikeThisFieldQueryData() public function testFuzzyLikeThisFieldQuery($field, $likeText, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $fuzzyLikeThisFieldQuery = new FuzzyLikeThisField($field, $likeText, $parameters); $search = $repo->createSearch()->addQuery($fuzzyLikeThisFieldQuery); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/Query/FuzzyTest.php b/Tests/Functional/DSL/Query/FuzzyTest.php index 17989e54..29b2f7da 100644 --- a/Tests/Functional/DSL/Query/FuzzyTest.php +++ b/Tests/Functional/DSL/Query/FuzzyTest.php @@ -88,7 +88,7 @@ public function getTestFuzzyQueryData() public function testFuzzyQuery($field, $value, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $fuzzyQuery = new FuzzyQuery($field, $value, $parameters); $search = $repo->createSearch()->addQuery($fuzzyQuery); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/Query/IdsTest.php b/Tests/Functional/DSL/Query/IdsTest.php index bca12a1b..62381a2e 100644 --- a/Tests/Functional/DSL/Query/IdsTest.php +++ b/Tests/Functional/DSL/Query/IdsTest.php @@ -83,7 +83,7 @@ public function getTestIdsQueryData() public function testIdsQuery($values, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $idsQuery = new IdsQuery($values); $search = $repo->createSearch()->addQuery($idsQuery); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/Query/IndicesQueryTest.php b/Tests/Functional/DSL/Query/IndicesQueryTest.php index 312fd584..d1d5f63b 100644 --- a/Tests/Functional/DSL/Query/IndicesQueryTest.php +++ b/Tests/Functional/DSL/Query/IndicesQueryTest.php @@ -92,7 +92,7 @@ public function getIndicesQueryData() public function testAndFilter($queryParams, $noMatchQueryParams, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $query = new TermQuery($queryParams[0], $queryParams[1]); if (is_string($noMatchQueryParams)) { diff --git a/Tests/Functional/DSL/Query/MatchAllTest.php b/Tests/Functional/DSL/Query/MatchAllTest.php index 359652fd..6e0541ad 100644 --- a/Tests/Functional/DSL/Query/MatchAllTest.php +++ b/Tests/Functional/DSL/Query/MatchAllTest.php @@ -69,7 +69,7 @@ public function getMatchAllData() public function testMatchAllQuery($parameters) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $matchAllQuery = new MatchAllQuery($parameters); $search = $repo->createSearch()->addQuery($matchAllQuery); diff --git a/Tests/Functional/DSL/Query/MatchTest.php b/Tests/Functional/DSL/Query/MatchTest.php index ae082b62..4704406b 100644 --- a/Tests/Functional/DSL/Query/MatchTest.php +++ b/Tests/Functional/DSL/Query/MatchTest.php @@ -84,7 +84,7 @@ public function getTestMatchQueryData() public function testMatchQuery($query, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $matchQuery = new MatchQuery($query, 'description', $parameters); diff --git a/Tests/Functional/DSL/Query/MoreLikeThisTest.php b/Tests/Functional/DSL/Query/MoreLikeThisTest.php index 462ac1da..c6a76eea 100644 --- a/Tests/Functional/DSL/Query/MoreLikeThisTest.php +++ b/Tests/Functional/DSL/Query/MoreLikeThisTest.php @@ -119,7 +119,7 @@ public function getTestMoreLikeThisQueryData() public function testMoreLikeThisQuery($query, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $moreLikeThisQuery = new MoreLikeThisQuery($query, $parameters); diff --git a/Tests/Functional/DSL/Query/MultiMatchTest.php b/Tests/Functional/DSL/Query/MultiMatchTest.php index e5d2b063..a7685897 100644 --- a/Tests/Functional/DSL/Query/MultiMatchTest.php +++ b/Tests/Functional/DSL/Query/MultiMatchTest.php @@ -101,7 +101,7 @@ public function getTestMultiMatchQueryData() public function testMultiMatchQuery($query, $fields, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $multiMatchQuery = new MultiMatchQuery($query, $fields); diff --git a/Tests/Functional/DSL/Query/NestedQueryTest.php b/Tests/Functional/DSL/Query/NestedQueryTest.php index 6a6b7d64..c7e465cb 100644 --- a/Tests/Functional/DSL/Query/NestedQueryTest.php +++ b/Tests/Functional/DSL/Query/NestedQueryTest.php @@ -132,7 +132,7 @@ public function getTestNestedQueryData() public function testNestedQuery($query, $expected, $mapping) { /** @var Repository $repo */ - $repo = $this->getManager('default', true, $mapping)->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager('default', true, $mapping)->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch()->addQuery($query, 'must'); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/Query/QueryStringTest.php b/Tests/Functional/DSL/Query/QueryStringTest.php index 599bbd68..38c16581 100644 --- a/Tests/Functional/DSL/Query/QueryStringTest.php +++ b/Tests/Functional/DSL/Query/QueryStringTest.php @@ -93,7 +93,7 @@ public function getTestQueryStringQueryData() public function testQueryStringQuery($query, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $queryStringQuery = new QueryStringQuery($query, $parameters); diff --git a/Tests/Functional/DSL/Query/RangeTest.php b/Tests/Functional/DSL/Query/RangeTest.php index 1ced8b37..b666d097 100644 --- a/Tests/Functional/DSL/Query/RangeTest.php +++ b/Tests/Functional/DSL/Query/RangeTest.php @@ -82,7 +82,7 @@ public function getTestRangeQueryData() public function testRangeQuery($parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $rangeQuery = new RangeQuery('price', $parameters); diff --git a/Tests/Functional/DSL/Query/RegexpTest.php b/Tests/Functional/DSL/Query/RegexpTest.php index 78862a9f..698da8ee 100644 --- a/Tests/Functional/DSL/Query/RegexpTest.php +++ b/Tests/Functional/DSL/Query/RegexpTest.php @@ -77,7 +77,7 @@ public function getTestRegexpQueryData() public function testRegexpQuery($regexp, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $matchQuery = new RegexpQuery('title', $regexp, $parameters); diff --git a/Tests/Functional/DSL/Query/SimpleQueryStringTest.php b/Tests/Functional/DSL/Query/SimpleQueryStringTest.php index 389e49f3..f77a5012 100644 --- a/Tests/Functional/DSL/Query/SimpleQueryStringTest.php +++ b/Tests/Functional/DSL/Query/SimpleQueryStringTest.php @@ -81,7 +81,7 @@ public function getTestSimpleQueryStringQueryData() public function testSimpleQueryStringQuery($query, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $matchQuery = new SimpleQueryStringQuery($query, $parameters); diff --git a/Tests/Functional/DSL/Query/SpanTermTest.php b/Tests/Functional/DSL/Query/SpanTermTest.php index 63296854..26e689c2 100644 --- a/Tests/Functional/DSL/Query/SpanTermTest.php +++ b/Tests/Functional/DSL/Query/SpanTermTest.php @@ -75,7 +75,7 @@ public function getTestSpanTermQueryData() public function testSpanTermQuery($field, $value, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new SpanTermQuery($field, $value); diff --git a/Tests/Functional/DSL/Query/TermTest.php b/Tests/Functional/DSL/Query/TermTest.php index 08db7ff7..fbc0916f 100644 --- a/Tests/Functional/DSL/Query/TermTest.php +++ b/Tests/Functional/DSL/Query/TermTest.php @@ -84,7 +84,7 @@ public function getTestTermQueryData() public function testTermQuery($field, $value, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new TermQuery($field, $value, $parameters); $search = $repo->createSearch()->addQuery($termQuery); $results = $repo->execute($search, Repository::RESULTS_ARRAY); @@ -96,7 +96,7 @@ public function testTermQuery($field, $value, $parameters, $expected) */ public function testMultipleTerm() { - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termQuery = new TermQuery('title', 'foo'); $termQuery2 = new TermQuery('price', 11); $search = $repo->createSearch(); diff --git a/Tests/Functional/DSL/Query/TermsTest.php b/Tests/Functional/DSL/Query/TermsTest.php index 509ab5c6..72ac6c1f 100644 --- a/Tests/Functional/DSL/Query/TermsTest.php +++ b/Tests/Functional/DSL/Query/TermsTest.php @@ -74,7 +74,7 @@ public function getTestTermsQueryData() public function testTermsQuery($tags, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $termsQuery = new TermsQuery('title', $tags, $parameters); diff --git a/Tests/Functional/DSL/Query/WildcardTest.php b/Tests/Functional/DSL/Query/WildcardTest.php index fe230f34..3fbc89cb 100644 --- a/Tests/Functional/DSL/Query/WildcardTest.php +++ b/Tests/Functional/DSL/Query/WildcardTest.php @@ -93,7 +93,7 @@ public function getTestWildcardQueryData() public function testWildcardQuery($field, $value, $parameters, $expected) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $wildcardQuery = new WildcardQuery($field, $value, $parameters); $search = $repo->createSearch()->addQuery($wildcardQuery); $results = $repo->execute($search, Repository::RESULTS_ARRAY); diff --git a/Tests/Functional/DSL/SearchTest.php b/Tests/Functional/DSL/SearchTest.php index c3a4fc65..be92ed43 100644 --- a/Tests/Functional/DSL/SearchTest.php +++ b/Tests/Functional/DSL/SearchTest.php @@ -97,7 +97,7 @@ public function setUp() { parent::setUp(); - $this->repository = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $this->repository = $this->getManager()->getRepository('AcmeTestBundle:Product'); } /** diff --git a/Tests/Functional/DSL/Sort/GeoSortTest.php b/Tests/Functional/DSL/Sort/GeoSortTest.php index 1ff0b721..b5ba1c7d 100644 --- a/Tests/Functional/DSL/Sort/GeoSortTest.php +++ b/Tests/Functional/DSL/Sort/GeoSortTest.php @@ -111,7 +111,7 @@ public function geoSortData() public function testGeoSort($sorts, $expectedIds, $expectedDistances) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch(); foreach ($sorts as $sort) { $search->addSort(new GeoSort($sort['field'], $sort['loc'], $sort['order'], $sort['unit'], $sort['mode'])); diff --git a/Tests/Functional/DSL/Sort/ScriptSortTest.php b/Tests/Functional/DSL/Sort/ScriptSortTest.php index aa2bc3a9..cd053351 100644 --- a/Tests/Functional/DSL/Sort/ScriptSortTest.php +++ b/Tests/Functional/DSL/Sort/ScriptSortTest.php @@ -95,7 +95,7 @@ public function scriptSortData() public function testScriptSort($sorts, $expectedIds) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch(); foreach ($sorts as $sort) { $search->addSort(new ScriptSort($sort['script'], $sort['type'], $sort['params'], $sort['order'])); diff --git a/Tests/Functional/DSL/Sort/SortTest.php b/Tests/Functional/DSL/Sort/SortTest.php index 698916a5..41b48083 100644 --- a/Tests/Functional/DSL/Sort/SortTest.php +++ b/Tests/Functional/DSL/Sort/SortTest.php @@ -109,7 +109,7 @@ public function simpleSortData() public function testSimpleSort($sorts, $expectedIds) { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch(); foreach ($sorts as $sort) { $search->addSort(new Sort($sort['field'], $sort['order'], $sort['nested'], $sort['mode'])); diff --git a/Tests/Functional/DSL/Suggester/CompletionTest.php b/Tests/Functional/DSL/Suggester/CompletionTest.php index 882549ef..296eb5c1 100644 --- a/Tests/Functional/DSL/Suggester/CompletionTest.php +++ b/Tests/Functional/DSL/Suggester/CompletionTest.php @@ -88,7 +88,7 @@ public function testCompletionSuggester() $repository = $this ->getManager('default', true, $this->getCustomMapping()) - ->getRepository('ONGRTestingBundle:Product'); + ->getRepository('AcmeTestBundle:Product'); $search = $repository->createSearch()->addSuggester($completion); $result = $repository->execute($search, Repository::RESULTS_RAW); diff --git a/Tests/Functional/DSL/Suggester/ContextTest.php b/Tests/Functional/DSL/Suggester/ContextTest.php new file mode 100644 index 00000000..ba198871 --- /dev/null +++ b/Tests/Functional/DSL/Suggester/ContextTest.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Functional\DSL\Suggester; + +use ONGR\ElasticsearchBundle\DSL\Suggester\Context; +use ONGR\ElasticsearchBundle\ORM\Repository; +use ONGR\ElasticsearchBundle\Test\ElasticsearchTestCase; + +/** + * Tests for context suggester. + */ +class ContextTest extends ElasticsearchTestCase +{ + /** + * {@inheritdoc} + */ + protected function getDataArray() + { + return [ + 'default' => [ + 'product' => [ + [ + '_id' => 1, + 'title' => 'foo', + 'suggestions' => [ + 'input' => ['Lorem', 'ipsum', 'cons'], + 'output' => 'Lorem ipsum', + 'payload' => new \stdClass(), + 'weight' => 1, + 'context' => [ + 'location' => [0, 0], + 'price' => 500, + ], + ], + ], + [ + '_id' => 2, + 'title' => 'bar', + 'suggestions' => [ + 'input' => ['Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'cons'], + 'output' => 'Lorem ipsum dolor sit amet...', + 'payload' => new \stdClass(), + 'weight' => 2, + 'context' => [ + 'location' => [1, 1], + 'price' => 500, + ], + ], + ], + [ + '_id' => 3, + 'title' => 'baz', + 'suggestions' => [ + 'input' => ['Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit'], + 'output' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit...', + 'payload' => ['my' => 'data'], + 'weight' => 3, + 'context' => [ + 'location' => [3, 3], + 'price' => 700, + ], + ], + ], + ], + ], + ]; + } + + /** + * Executes completion suggester. + */ + public function testContextSuggester() + { + $geoContext = new Context\GeoContext('location', ['lat' => 0, 'lon' => 0]); + $categoryContext = new Context\CategoryContext('price', '500'); + + $context = new Context('suggestions', 'cons'); + $context->addContext($geoContext); + $context->addContext($categoryContext); + + $repository = $this->getManager()->getRepository('AcmeTestBundle:Product'); + $search = $repository->createSearch()->addSuggester($context); + $result = $repository->execute($search, Repository::RESULTS_RAW); + + $this->assertArrayHasKey('score', $result['suggest']['suggestions-completion'][0]['options'][0]); + unset($result['suggest']['suggestions-completion'][0]['options'][0]['score']); + + $this->assertEquals( + [ + 'suggestions-completion' => [ + [ + 'text' => 'cons', + 'offset' => 0, + 'length' => 4, + 'options' => [ + [ + 'text' => 'Lorem ipsum', + 'payload' => [], + ], + ], + ], + ], + ], + $result['suggest'] + ); + } + + /** + * Check if precision setting works as expected. + */ + public function testContextSuggesterPrecision() + { + $geoContext = new Context\GeoContext('location', ['lat' => 0, 'lon' => 0]); + $geoContext->setPrecision('10000km'); + $categoryContext = new Context\CategoryContext('price', '500'); + + $context = new Context('suggestions', 'cons'); + $context->addContext($geoContext); + $context->addContext($categoryContext); + + $repository = $this->getManager()->getRepository('AcmeTestBundle:Product'); + $search = $repository->createSearch()->addSuggester($context); + $result = $repository->execute($search, Repository::RESULTS_RAW); + + $this->assertEmpty($result['suggest']['suggestions-completion'][0]['options']); + } +} diff --git a/Tests/Functional/DSL/Suggester/PhraseTest.php b/Tests/Functional/DSL/Suggester/PhraseTest.php index 6386d009..0702bd53 100644 --- a/Tests/Functional/DSL/Suggester/PhraseTest.php +++ b/Tests/Functional/DSL/Suggester/PhraseTest.php @@ -66,7 +66,7 @@ public function testPhraseSuggester() ] ); - $repository = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repository = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repository->createSearch()->addSuggester($phrase); $results = $repository->execute($search, Repository::RESULTS_RAW); diff --git a/Tests/Functional/DSL/Suggester/TermTest.php b/Tests/Functional/DSL/Suggester/TermTest.php index f25dd284..3f403a05 100644 --- a/Tests/Functional/DSL/Suggester/TermTest.php +++ b/Tests/Functional/DSL/Suggester/TermTest.php @@ -56,7 +56,7 @@ public function testTermSuggester() $term = new Term('description', 'ipsu'); $term->setAnalyzer('simple'); - $repository = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repository = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repository->createSearch()->addSuggester($term); $raw = $repository->execute($search, Repository::RESULTS_RAW); diff --git a/Tests/Functional/DependencyInjection/Compiler/MappingPassTest.php b/Tests/Functional/DependencyInjection/Compiler/MappingPassTest.php index 637c584c..de36f18c 100644 --- a/Tests/Functional/DependencyInjection/Compiler/MappingPassTest.php +++ b/Tests/Functional/DependencyInjection/Compiler/MappingPassTest.php @@ -30,7 +30,7 @@ public function testMapping() $container = $this->createClient()->getContainer(); $this->assertArrayHasKey( - 'ONGRTestingBundle', + 'AcmeTestBundle', $container->getParameter('kernel.bundles'), 'Test bundle is not loaded.' ); @@ -42,7 +42,7 @@ public function testMapping() $connection = $container->get('es.manager')->getConnection(); $productMapping = $connection->getMapping('product'); $expectedMapping = $mappingService->getMappingByNamespace( - 'ONGR\TestingBundle\Document\Product' + 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product' ); $this->assertEquals($expectedMapping['product']['properties'], $productMapping['properties']); diff --git a/Tests/Functional/DependencyInjection/ElasticsearchExtensionTest.php b/Tests/Functional/DependencyInjection/ElasticsearchExtensionTest.php index 1de07eeb..cca07feb 100644 --- a/Tests/Functional/DependencyInjection/ElasticsearchExtensionTest.php +++ b/Tests/Functional/DependencyInjection/ElasticsearchExtensionTest.php @@ -83,7 +83,7 @@ public function testContainerDefaultParams() 'default' => [ 'connection' => 'default', 'debug' => true, - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], 'bar' => [ 'connection' => 'bar', diff --git a/Tests/Functional/ORM/ManagerTest.php b/Tests/Functional/ORM/ManagerTest.php index 99d73297..c8d179ae 100644 --- a/Tests/Functional/ORM/ManagerTest.php +++ b/Tests/Functional/ORM/ManagerTest.php @@ -14,10 +14,13 @@ use ONGR\ElasticsearchBundle\Document\DocumentInterface; use ONGR\ElasticsearchBundle\ORM\Manager; use ONGR\ElasticsearchBundle\Test\ElasticsearchTestCase; -use ONGR\TestingBundle\Document\CdnObject; -use ONGR\TestingBundle\Document\Comment; -use ONGR\TestingBundle\Document\Product; -use ONGR\TestingBundle\Document\UrlObject; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\CdnObject; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Comment; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\CompletionSuggesting; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\PriceLocationSuggesting; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\PriceLocationContext; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\UrlObject; /** * Functional tests for orm manager. @@ -54,7 +57,7 @@ public function testPersist() $manager->persist($product); $manager->commit(); - $repository = $manager->getRepository('ONGRTestingBundle:Product'); + $repository = $manager->getRepository('AcmeTestBundle:Product'); /** @var Product[] $actualProduct */ $actualProducts = $repository->execute($repository->createSearch()); $this->assertCount(1, $actualProducts); @@ -72,6 +75,49 @@ public function testPersist() $this->assertEquals($cdn->cdn_url, $actualUrl[0]->cdn->cdn_url); } + /** + * Check if indexed suggest fields are stored as expected. + */ + public function testPersistSuggesters() + { + /** @var Manager $manager */ + $manager = $this->getManager(); + + $categoryContext = new PriceLocationContext(); + $categoryContext->price = '500'; + $categoryContext->location = ['lat' => 50, 'lon' => 50]; + $suggester = new PriceLocationSuggesting(); + $suggester->setInput(['test']); + $suggester->setOutput('success'); + $suggester->setContext($categoryContext); + $suggester->setPayload(['test']); + $suggester->setWeight(50); + + $completionSuggester = new CompletionSuggesting(); + $completionSuggester->setInput(['a', 'b', 'c']); + $completionSuggester->setOutput('completion success'); + $completionSuggester->setWeight(30); + + $product = new Product(); + $product->contextSuggesting = $suggester; + $product->completionSuggesting = $completionSuggester; + + $manager->persist($product); + $manager->commit(); + + $repository = $manager->getRepository('AcmeTestBundle:Product'); + /** @var Product[] $actualProduct */ + $actualProducts = $repository->execute($repository->createSearch()); + $this->assertCount(1, $actualProducts); + + /** @var Product $actualProduct */ + $actualProduct = $actualProducts->current(); + $actualProduct->setId(null); + $actualProduct->setScore(null); + + $this->assertEquals($product, $actualProduct); + } + /** * Data provider for testPersistExceptions(). * @@ -99,7 +145,8 @@ public function getPersistExceptionsData() $product->links = new \ArrayIterator([new UrlObject(), new CdnObject()]); $out[] = [ $product, - 'Expected object of type ONGR\TestingBundle\Document\UrlObject, got ONGR\TestingBundle\Document\CdnObject.', + 'Expected object of type ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\UrlObject, ' . + 'got ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\CdnObject.', ]; // Case #3: invalid type of object is set in single field. @@ -110,7 +157,8 @@ public function getPersistExceptionsData() $product->links = [$url]; $out[] = [ $product, - 'Expected object of type ONGR\TestingBundle\Document\CdnObject, got ONGR\TestingBundle\Document\UrlObject.', + 'Expected object of type ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\CdnObject, ' . + 'got ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\UrlObject.', ]; return $out; @@ -153,7 +201,7 @@ public function testPersistSpecialFields() $manager->persist($comment); $manager->commit(); - $repository = $manager->getRepository('ONGRTestingBundle:Comment'); + $repository = $manager->getRepository('AcmeTestBundle:Comment'); $search = $repository->createSearch(); $results = $repository->execute($search); /** @var DocumentInterface $actualProduct */ @@ -180,7 +228,7 @@ public function testPersistDateField() $manager->persist($comment); $manager->commit(); - $repository = $manager->getRepository('ONGRTestingBundle:Comment'); + $repository = $manager->getRepository('AcmeTestBundle:Comment'); $search = $repository->createSearch(); $results = $repository->execute($search); /** @var DocumentInterface $actualProduct */ diff --git a/Tests/Functional/ORM/RepositoryTest.php b/Tests/Functional/ORM/RepositoryTest.php index b4f39dba..3ece074e 100644 --- a/Tests/Functional/ORM/RepositoryTest.php +++ b/Tests/Functional/ORM/RepositoryTest.php @@ -13,9 +13,17 @@ use ONGR\ElasticsearchBundle\Document\DocumentInterface; use ONGR\ElasticsearchBundle\DSL\Filter\PrefixFilter; +use ONGR\ElasticsearchBundle\DSL\Suggester\Completion; +use ONGR\ElasticsearchBundle\DSL\Suggester\Context; +use ONGR\ElasticsearchBundle\DSL\Suggester\Phrase; +use ONGR\ElasticsearchBundle\DSL\Suggester\Term; use ONGR\ElasticsearchBundle\ORM\Repository; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\CompletionOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\SimpleOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\TermOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionIterator; use ONGR\ElasticsearchBundle\Test\ElasticsearchTestCase; -use ONGR\TestingBundle\Document\Product; +use ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product; class RepositoryTest extends ElasticsearchTestCase { @@ -31,19 +39,34 @@ protected function getDataArray() '_id' => 1, 'title' => 'foo', 'price' => 10, - 'description' => 'goo', + 'description' => 'goo Lorem', + 'suggestions' => [ + 'input' => ['Lorem', 'ipsum', 'cons'], + 'output' => 'Lorem ipsum', + 'payload' => ['test' => true], + 'weight' => 1, + 'context' => [ + 'location' => [0, 0], + 'price' => 500, + ], + ], + 'completion_suggesting' => [ + 'input' => ['Lorem', 'ipsum'], + 'output' => 'Lorem ipsum', + 'weight' => 1, + ], ], [ '_id' => 2, 'title' => 'bar', 'price' => 1000, - 'description' => 'foo bar', + 'description' => 'foo bar Lorem adips distributed disributed', ], [ '_id' => 3, 'title' => 'gar', 'price' => 100, - 'description' => 'foo bar', + 'description' => 'foo bar Loremo', ], ], ], @@ -160,7 +183,7 @@ public function getFindByData() */ public function testFindBy($expectedResults, $criteria, $orderBy = [], $limit = null, $offset = null) { - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $fullResults = $repo->findBy($criteria, $orderBy, $limit, $offset); @@ -194,7 +217,7 @@ public function testFind() $manager->persist($product); $manager->commit(); - $repo = $manager->getRepository('ONGRTestingBundle:Product'); + $repo = $manager->getRepository('AcmeTestBundle:Product'); $result = $repo->find(123); @@ -208,7 +231,7 @@ public function testFind() */ public function testFindException() { - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $repo->find(123); } @@ -221,7 +244,7 @@ public function testFindException() public function testFindInMultiTypeRepo() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository(['ONGRTestingBundle:Product', 'ONGRTestingBundle:Content']); + $repo = $this->getManager()->getRepository(['AcmeTestBundle:Product', 'AcmeTestBundle:Content']); $repo->find(1); } @@ -233,7 +256,7 @@ public function testRemove() { $manager = $this->getManager(); - $repo = $manager->getRepository('ONGRTestingBundle:Product'); + $repo = $manager->getRepository('AcmeTestBundle:Product'); $response = $repo->remove(3); @@ -250,7 +273,7 @@ public function testRemoveException() { $manager = $this->getManager(); - $repo = $manager->getRepository('ONGRTestingBundle:Product'); + $repo = $manager->getRepository('AcmeTestBundle:Product'); $repo->remove(500); } @@ -260,11 +283,11 @@ public function testRemoveException() */ public function testCreateDocument() { - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $document = $repo->createDocument(); $this->assertInstanceOf( - 'ONGR\TestingBundle\Document\Product', + 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product', $document ); } @@ -277,7 +300,7 @@ public function testCreateDocument() */ public function testCreateDocumentException() { - $repo = $this->getManager()->getRepository(['ONGRTestingBundle:Product', 'ONGRTestingBundle:Content']); + $repo = $this->getManager()->getRepository(['AcmeTestBundle:Product', 'AcmeTestBundle:Content']); $repo->createDocument(); } @@ -287,7 +310,7 @@ public function testCreateDocumentException() public function testRepositoryExecuteWhenZeroResult() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch(); $search->addFilter(new PrefixFilter('title', 'dummy')); @@ -314,7 +337,7 @@ protected function getProductsArray() public function testDocumentUpdate() { $manager = $this->getManager(); - $repository = $manager->getRepository('ONGRTestingBundle:Product'); + $repository = $manager->getRepository('AcmeTestBundle:Product'); /** @var Product $document */ $document = $repository->createDocument(); @@ -352,4 +375,179 @@ public function testDocumentUpdate() 'Document should be updated.' ); } + + /** + * Data provider for testSuggest(). + * + * @return array + */ + public function getSuggestData() + { + $out = []; + + // Case #0: simple single term suggester. + $expectedResults = [ + 'description-term' => [ + [ + 'text' => 'distibutd', + 'offset' => '0', + 'length' => '9', + 'options' => [ + new TermOption('disributed', 0.0, 1), + new TermOption('distributed', 0.0, 1), + ], + ], + ] + ]; + + $suggesters = [new Term('description', 'distibutd')]; + $out[] = ['suggesters' => $suggesters, 'expectedResults' => $expectedResults]; + + // Case #1: simple single phrase suggester. + $expectedResults = [ + 'description-phrase' => [ + [ + 'text' => 'Lorm adip', + 'offset' => '0', + 'length' => '9', + 'options' => [new SimpleOption('lorem adip', 0.0)], + ], + ] + ]; + + $suggesters = [new Phrase('description', 'Lorm adip')]; + $out[] = ['suggesters' => $suggesters, 'expectedResults' => $expectedResults]; + + // Case #2: simple context suggester. + $geoContext = new Context\GeoContext('location', ['lat' => 0, 'lon' => 0]); + $categoryContext = new Context\CategoryContext('price', '500'); + $context = new Context('suggestions', 'cons'); + $context->addContext($geoContext); + $context->addContext($categoryContext); + + $expectedResults = [ + 'suggestions-completion' => [ + [ + 'text' => 'cons', + 'offset' => '0', + 'length' => '4', + 'options' => [new CompletionOption('Lorem ipsum', 0.0, ['test' => true])], + ], + ] + ]; + + $out[] = ['suggesters' => $context, 'expectedResults' => $expectedResults]; + + // Case #3: simple completion suggester. + $completion = new Completion('completion_suggesting', 'ipsum'); + $expectedResults = [ + 'completion_suggesting-completion' => [ + [ + 'text' => 'ipsum', + 'offset' => '0', + 'length' => '5', + 'options' => [new SimpleOption('Lorem ipsum', 0.0, null)], + ], + ] + ]; + + $out[] = ['suggesters' => $completion, 'expectedResults' => $expectedResults]; + + // Case #4: all together. + $geoContext = new Context\GeoContext('location', ['lat' => 0, 'lon' => 0]); + $categoryContext = new Context\CategoryContext('price', '500'); + $context = new Context('suggestions', 'cons'); + $context->addContext($geoContext); + $context->addContext($categoryContext); + $suggesters = [ + new Term('description', 'distibutd'), + new Phrase('description', 'Lorm adip'), + $context, + new Completion('completion_suggesting', 'ipsum'), + ]; + $expectedResults = [ + 'description-term' => [ + [ + 'text' => 'distibutd', + 'offset' => '0', + 'length' => '9', + 'options' => [ + new TermOption('disributed', 0.0, 1), + new TermOption('distributed', 0.0, 1), + ], + ], + ], + 'description-phrase' => [ + [ + 'text' => 'Lorm adip', + 'offset' => '0', + 'length' => '9', + 'options' => [new SimpleOption('lorem adip', 0.0)], + ], + ], + 'suggestions-completion' => [ + [ + 'text' => 'cons', + 'offset' => '0', + 'length' => '4', + 'options' => [new CompletionOption('Lorem ipsum', 0.0, ['test' => true])], + ], + ], + 'completion_suggesting-completion' => [ + [ + 'text' => 'ipsum', + 'offset' => '0', + 'length' => '5', + 'options' => [new SimpleOption('Lorem ipsum', 0.0, null)], + ], + ] + ]; + $out[] = ['suggesters' => $suggesters, 'expectedResults' => $expectedResults]; + + return $out; + } + + /** + * Check if suggest api works as expected. + * + * @param array $suggesters + * @param array $expectedResults + * + * @dataProvider getSuggestData() + */ + public function testSuggest($suggesters, $expectedResults) + { + $manager = $this->getManager(); + $repository = $manager->getRepository('AcmeTestBundle:Product'); + + $results = $repository->suggest($suggesters); + $this->assertScore($results); + + $this->assertSameSize($expectedResults, $results); + foreach ($expectedResults as $name => $expectedSuggestion) { + foreach ($expectedResults[$name] as $key => $entry) { + $this->assertEquals($entry['text'], $results[$name][$key]->getText()); + $this->assertEquals($entry['offset'], $results[$name][$key]->getOffset()); + $this->assertEquals($entry['length'], $results[$name][$key]->getLength()); + $this->assertEquals($entry['options'], iterator_to_array($results[$name][$key]->getOptions())); + } + } + } + + /** + * Assert suggestion score is set. + * + * @param SuggestionIterator $suggestions + */ + private function assertScore(SuggestionIterator $suggestions) + { + foreach ($suggestions as $suggestion) { + foreach ($suggestion as $suggestionEntry) { + foreach ($suggestionEntry->getOptions() as $option) { + $this->assertTrue($option->getScore() > 0.0); + $option->setScore(0.0); + } + } + } + } } diff --git a/Tests/Functional/Result/AggregationIteratorFindTest.php b/Tests/Functional/Result/AggregationIteratorFindTest.php index c32a2cac..b158569f 100644 --- a/Tests/Functional/Result/AggregationIteratorFindTest.php +++ b/Tests/Functional/Result/AggregationIteratorFindTest.php @@ -120,7 +120,7 @@ public function getTestIterationData() public function testIteration($path, $expected) { $aggregation = $this->buildAggregation(); - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $search = $repo->createSearch()->addAggregation($aggregation); $results = $repo->execute($search); $result = $results->getAggregations()->find($path); diff --git a/Tests/Functional/Result/DocumentIteratorTest.php b/Tests/Functional/Result/DocumentIteratorTest.php index 92ce8e20..2a27d88d 100644 --- a/Tests/Functional/Result/DocumentIteratorTest.php +++ b/Tests/Functional/Result/DocumentIteratorTest.php @@ -60,7 +60,7 @@ protected function getDataArray() public function testIteration() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Product'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); $match = new MatchAllQuery(); $search = $repo->createSearch()->addQuery($match); $iterator = $repo->execute($search, Repository::RESULTS_OBJECT); @@ -71,14 +71,14 @@ public function testIteration() $urls = $document->links; $this->assertInstanceOf( - 'ONGR\TestingBundle\Document\Product', + 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product', $document ); $this->assertInstanceOf('ONGR\ElasticsearchBundle\Result\ObjectIterator', $urls); foreach ($urls as $url) { $this->assertInstanceOf( - 'ONGR\TestingBundle\Document\UrlObject', + 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\UrlObject', $url ); } @@ -90,7 +90,7 @@ public function testIteration() */ public function testCurrentWithEmptyIterator() { - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Content'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Content'); $search = $repo ->createSearch() ->addQuery(new MatchAllQuery()); diff --git a/Tests/Functional/Result/DocumentScanIteratorTest.php b/Tests/Functional/Result/DocumentScanIteratorTest.php index f33c714e..ceb47ac3 100644 --- a/Tests/Functional/Result/DocumentScanIteratorTest.php +++ b/Tests/Functional/Result/DocumentScanIteratorTest.php @@ -41,7 +41,7 @@ public function testIteration() { /** @var Repository $repo */ - $repo = $this->getManager()->getRepository('ONGRTestingBundle:Content'); + $repo = $this->getManager()->getRepository('AcmeTestBundle:Content'); $search = $repo->createSearch(); $search->setSize(2); diff --git a/Tests/Functional/Result/SuggestionsIteratorTest.php b/Tests/Functional/Result/SuggestionsIteratorTest.php new file mode 100644 index 00000000..395ac47a --- /dev/null +++ b/Tests/Functional/Result/SuggestionsIteratorTest.php @@ -0,0 +1,213 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Functional\Result; + +use ONGR\ElasticsearchBundle\DSL\Query\MatchAllQuery; +use ONGR\ElasticsearchBundle\DSL\Suggester\AbstractSuggester; +use ONGR\ElasticsearchBundle\DSL\Suggester\Completion; +use ONGR\ElasticsearchBundle\DSL\Suggester\Context; +use ONGR\ElasticsearchBundle\DSL\Suggester\Phrase; +use ONGR\ElasticsearchBundle\DSL\Suggester\Term; +use ONGR\ElasticsearchBundle\ORM\Repository; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\CompletionOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\PhraseOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\SimpleOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\TermOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionEntry; +use ONGR\ElasticsearchBundle\Test\ElasticsearchTestCase; + +class SuggestionsIteratorTest extends ElasticsearchTestCase +{ + /** + * {@inheritdoc} + */ + protected function getDataArray() + { + return [ + 'default' => [ + 'product' => [ + [ + '_id' => 1, + 'title' => 'foo', + 'price' => 10, + 'description' => 'Lorem ipsum', + 'suggestions' => [ + 'input' => ['Lorem', 'ipsum', 'cons'], + 'output' => 'Lorem ipsum', + 'payload' => ['test' => true], + 'weight' => 1, + 'context' => [ + 'location' => [0, 0], + 'price' => 500, + ], + ], + 'completion_suggesting' => [ + 'input' => ['Lorem', 'ipsum'], + 'output' => 'Lorem ipsum', + 'weight' => 1, + ], + ], + [ + '_id' => 2, + 'title' => 'bar', + 'price' => 100, + 'description' => 'Lorem ipsum dolor sit amet... amte distributed disributed', + ], + [ + '_id' => 3, + 'title' => 'baz', + 'price' => 1000, + 'description' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit...', + ], + ], + ], + ]; + } + + /** + * Data provider for testSuggestionIterator(). + * + * @return array + */ + public function getSuggestIterationData() + { + $out = []; + + // Case #0, Phrase type with all parameters set. + $phrase = new Phrase('description', 'Lorm adip'); + $phrase->setAnalyzer('simple'); + $phrase->setSize(1); + $phrase->setRealWordErrorLikelihood(0.95); + $phrase->setMaxErrors(0.5); + $phrase->setGramSize(2); + $phrase->setHighlight( + [ + 'pre_tag' => '', + 'post_tag' => '', + ] + ); + $expectedOption = new PhraseOption('lorem adip', 0.0, 'lorem adip'); + + $out[] = ['suggesters' => [$phrase], 'expectedOptions' => [$expectedOption]]; + + // Case #1, Phrase type with almost nothing set. + $phrase = new Phrase('description', 'Lorm adip'); + $expectedOption = new SimpleOption('lorem adip', 0.0); + + $out[] = ['suggesters' => [$phrase], 'expectedOptions' => [$expectedOption]]; + + // Case #2, Term type with almost nothing set. + $term = new Term('description', 'ipsu'); + $expectedOption = new TermOption('ipsum', 0.0, 3); + + $out[] = ['suggesters' => [$term], 'expectedOptions' => [$expectedOption]]; + + // Case #3, Multiple suggesters. + $term = new Term('description', 'ipsu'); + $phrase = new Phrase('description', 'Lorm adip'); + $expectedOptions = [new SimpleOption('lorem adip', 0.0), new TermOption('ipsum', 0.0, 3)]; + + $out[] = ['suggesters' => [$term, $phrase], 'expectedOptions' => $expectedOptions]; + + // Case #4, Multiple options within multiple suggesters. + $term = new Term('description', 'distibutd'); + $phrase = new Phrase('description', 'Lorm adip'); + $expectedOptions = [ + new SimpleOption('lorem adip', 0.0), + new TermOption('disributed', 0.0, 1), + new TermOption('distributed', 0.0, 1), + ]; + + $out[] = ['suggesters' => [$term, $phrase], 'expectedOptions' => $expectedOptions]; + + // Case #5, completion option using context suggester, with payload. + $geoContext = new Context\GeoContext('location', ['lat' => 0, 'lon' => 0]); + $categoryContext = new Context\CategoryContext('price', '500'); + $context = new Context('suggestions', 'cons'); + $context->addContext($geoContext); + $context->addContext($categoryContext); + $expectedOption = new CompletionOption('Lorem ipsum', 0.0, ['test' => true]); + + $out[] = ['suggesters' => [$context], 'expectedOptions' => [$expectedOption]]; + + // Case #6, completion option using completion suggester, no payload. + $completion = new Completion('completion_suggesting', 'ipsum'); + $expectedOption = new SimpleOption('Lorem ipsum', 0.0, null); + + $out[] = ['suggesters' => [$completion], 'expectedOptions' => [$expectedOption]]; + + return $out; + } + + /** + * Iteration test. + * + * @param AbstractSuggester[] $suggesters + * @param SimpleOption[] $expectedOptions + * + * @dataProvider getSuggestIterationData() + */ + public function testSuggestionIteration($suggesters, $expectedOptions) + { + /** @var Repository $repo */ + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); + $match = new MatchAllQuery(); + $search = $repo->createSearch()->addQuery($match); + + foreach ($suggesters as $suggester) { + $search->addSuggester($suggester); + } + + $iterator = $repo->execute($search, Repository::RESULTS_OBJECT); + + $this->assertInstanceOf('ONGR\ElasticsearchBundle\Result\DocumentIterator', $iterator); + + $suggestions = iterator_to_array($iterator->getSuggestions()); + + sort($suggestions); + sort($expectedOptions); + + $optionCount = 0; + /** @var SuggestionEntry[] $suggestionEntries */ + foreach ($suggestions as $suggestionEntries) { + foreach ($suggestionEntries as $suggestionEntry) { + $this->assertInstanceOf('ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionEntry', $suggestionEntry); + $options = iterator_to_array($suggestionEntry->getOptions()); + sort($options); + + /** @var SimpleOption $option */ + foreach ($options as $option) { + $option->setScore(0.0); + $this->assertEquals($expectedOptions[$optionCount++], $option); + } + } + } + $this->assertEquals(count($expectedOptions), $optionCount, 'Expecteded option count was not met.'); + } + + /** + * Check if suggestion properties are set as expected. + */ + public function testSuggestionProperties() + { + /** @var Repository $repo */ + $repo = $this->getManager()->getRepository('AcmeTestBundle:Product'); + $match = new MatchAllQuery(); + $search = $repo->createSearch()->addQuery($match); + $search->addSuggester(new Phrase('description', 'Lorm adip', 'test')); + + $suggestions = $repo->execute($search, Repository::RESULTS_OBJECT)->getSuggestions(); + $this->assertEquals('Lorm adip', $suggestions['test'][0]->getText()); + $this->assertEquals(9, $suggestions['test'][0]->getLength()); + $this->assertEquals(0, $suggestions['test'][0]->getOffset()); + } +} diff --git a/Tests/Functional/Service/ESDataCollectorTest.php b/Tests/Functional/Service/ESDataCollectorTest.php index 7dcd2127..804564b6 100644 --- a/Tests/Functional/Service/ESDataCollectorTest.php +++ b/Tests/Functional/Service/ESDataCollectorTest.php @@ -51,7 +51,7 @@ protected function getDataArray() public function testGetQueryCount() { $manager = $this->getManager(); - $repository = $manager->getRepository('ONGRTestingBundle:Product'); + $repository = $manager->getRepository('AcmeTestBundle:Product'); $document = $repository->createDocument(); $document->title = 'Awesomo'; @@ -69,7 +69,7 @@ public function testGetQueryCount() public function testGetTime() { $manager = $this->getManager(); - $repository = $manager->getRepository('ONGRTestingBundle:Product'); + $repository = $manager->getRepository('AcmeTestBundle:Product'); $repository->find(3); $this->assertGreaterThan(0.0, $this->getCollector()->getTime(), 'Time should be greater than 0ms'); @@ -81,7 +81,7 @@ public function testGetTime() public function testGetQueries() { $manager = $this->getManager(); - $repository = $manager->getRepository('ONGRTestingBundle:Product'); + $repository = $manager->getRepository('AcmeTestBundle:Product'); $repository->find(2); $queries = $this->getCollector()->getQueries(); diff --git a/Tests/Unit/DependencyInjection/ConfigurationTest.php b/Tests/Unit/DependencyInjection/ConfigurationTest.php index c038c430..e5ff87ec 100644 --- a/Tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/Tests/Unit/DependencyInjection/ConfigurationTest.php @@ -38,7 +38,7 @@ public function getTestConfigurationData() 'acme' => [ 'connection' => 'acme', 'debug' => false, - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], ], 'document_dir' => 'Document', @@ -56,7 +56,7 @@ public function getTestConfigurationData() 'managers' => [ 'acme' => [ 'connection' => 'acme', - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], ], ], @@ -77,7 +77,7 @@ public function getTestConfigurationData() 'managers' => [ 'acme' => [ 'connection' => 'acme', - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], ], ], @@ -96,7 +96,7 @@ public function getTestConfigurationData() 'managers' => [ 'acme' => [ 'connection' => 'acme', - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], ], ], @@ -117,7 +117,7 @@ public function getTestConfigurationData() 'managers' => [ 'acme' => [ 'connection' => 'acme', - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], ], ], @@ -167,7 +167,7 @@ public function getTestConfigurationData() 'managers' => [ 'acme' => [ 'connection' => 'acme', - 'mappings' => ['ONGRTestingBundle'], + 'mappings' => ['AcmeTestBundle'], ], ], ], diff --git a/Tests/Unit/Mapping/MetadataCollectorTest.php b/Tests/Unit/Mapping/MetadataCollectorTest.php index b7961fd7..c60bcb45 100644 --- a/Tests/Unit/Mapping/MetadataCollectorTest.php +++ b/Tests/Unit/Mapping/MetadataCollectorTest.php @@ -98,7 +98,7 @@ public function testGetMappingCache() ->getMockBuilder('ONGR\ElasticsearchBundle\Mapping\MetadataCollector') ->setConstructorArgs( [ - ['ONGRTestingBundle' => 'ONGR/TestingBundle/ONGRTestingBundle'], + ['AcmeTestBundle' => 'ONGR/TestingBundle/AcmeTestBundle'], $this->getCachedReaderMock(), ] ) @@ -108,13 +108,13 @@ public function testGetMappingCache() $collector ->expects($this->exactly(1)) ->method('getBundleMapping') - ->with('ONGRTestingBundle') + ->with('AcmeTestBundle') ->will($this->returnValue($mapping)); // Caches. - $this->assertEquals($expectedMapping, $collector->getMapping('ONGRTestingBundle')); + $this->assertEquals($expectedMapping, $collector->getMapping('AcmeTestBundle')); // Loads from local cache. - $this->assertEquals($expectedMapping, $collector->getMapping('ONGRTestingBundle')); + $this->assertEquals($expectedMapping, $collector->getMapping('AcmeTestBundle')); } /** @@ -125,11 +125,11 @@ public function testGetMappingCache() public function testGet() { $collector = new MetadataCollector( - ['ONGRTestingBundle' => 'ONGR\TestingBundle\ONGRTestingBundle'], + ['AcmeTestBundle' => 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\AcmeTestBundle'], new AnnotationReader() ); - $mapping = $collector->getMapping('ONGRTestingBundle'); + $mapping = $collector->getMapping('AcmeTestBundle'); $this->assertArrayContainsArray( [ @@ -165,7 +165,7 @@ public function testGet() public function testBundleNotFound() { $collector = new MetadataCollector([], $this->getCachedReaderMock()); - $collector->getMapping('ONGRTestingBundle'); + $collector->getMapping('AcmeTestBundle'); } /** @@ -176,17 +176,17 @@ public function getTestGetMappingByNamespaceData() $mapping = [ 'product' => [ 'properties' => $this->getProductMapping(), - 'class' => 'ONGR\TestingBundle\Document\Product', + 'class' => 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product', ] ]; return [ [ - 'ONGRTestingBundle:Product', + 'AcmeTestBundle:Product', $mapping, ], [ - 'ONGR\TestingBundle\Document\Product', + 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Product', $mapping, ], ]; @@ -203,7 +203,7 @@ public function getTestGetMappingByNamespaceData() public function testGetMappingByNamespace($namespace, $expectedMapping) { $collector = new MetadataCollector( - ['ONGRTestingBundle' => 'ONGR\TestingBundle\ONGRTestingBundle'], + ['AcmeTestBundle' => 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\AcmeTestingBundle'], new AnnotationReader() ); diff --git a/Tests/Unit/ORM/RepositoryTest.php b/Tests/Unit/ORM/RepositoryTest.php index 0095fe5c..3d25a7f5 100644 --- a/Tests/Unit/ORM/RepositoryTest.php +++ b/Tests/Unit/ORM/RepositoryTest.php @@ -27,11 +27,11 @@ public function getExecuteData() $out = []; $bundlesMapping = [ - 'ONGRTestingBundle:Product' => [ + 'AcmeTestBundle:Product' => [ 'type' => 'product', 'fields' => [], ], - 'ONGRTestingBundle:Content' => [ + 'AcmeTestBundle:Content' => [ 'type' => 'content', 'fields' => [], ], @@ -39,7 +39,7 @@ public function getExecuteData() // Case #0 Single type. $out[] = [ - ['ONGRTestingBundle:Product'], + ['AcmeTestBundle:Product'], ['product'], $bundlesMapping, ]; diff --git a/Tests/Unit/Result/DocumentIteratorTest.php b/Tests/Unit/Result/DocumentIteratorTest.php index 49b8dec3..37166e90 100644 --- a/Tests/Unit/Result/DocumentIteratorTest.php +++ b/Tests/Unit/Result/DocumentIteratorTest.php @@ -13,6 +13,8 @@ use ONGR\ElasticsearchBundle\Result\Aggregation\ValueAggregation; use ONGR\ElasticsearchBundle\Result\DocumentIterator; +use ONGR\ElasticsearchBundle\Result\Suggestion\OptionIterator; +use ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionEntry; class DocumentIteratorTest extends \PHPUnit_Framework_TestCase { @@ -258,14 +260,16 @@ public function testGetSuggestions() ], 'suggest' => [ 'foo' => [ - 'text' => 'foobar', - 'offset' => 0, - 'length' => 6, - 'options' => [ - [ - 'text' => 'foobar', - 'freq' => 77, - 'score' => 0.8888889, + [ + 'text' => 'foobar', + 'offset' => 0, + 'length' => 6, + 'options' => [ + [ + 'text' => 'foobar', + 'freq' => 77, + 'score' => 0.8888889, + ], ], ], ], @@ -273,12 +277,21 @@ public function testGetSuggestions() ]; $iterator = new DocumentIterator($rawData, [], []); + $suggestions = $iterator->getSuggestions(); $this->assertInstanceOf( - 'ONGR\ElasticsearchBundle\Result\Suggestions', + 'ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionIterator', $iterator->getSuggestions() ); - $this->assertEquals($rawData['suggest']['foo'], $iterator->getSuggestions()['foo']); + + $expectedSuggestion = new SuggestionEntry( + 'foobar', + 0, + 6, + new OptionIterator($rawData['suggest']['foo'][0]['options']) + ); + + $this->assertEquals($expectedSuggestion, $suggestions['foo'][0]); } /** @@ -291,7 +304,7 @@ private function assertContentEquals($iterator, $expectedHeaders) { foreach ($iterator as $key => $item) { $this->assertInstanceOf( - 'ONGR\TestingBundle\Document\Content', + 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Content', $item ); $this->assertEquals($expectedHeaders[$key], $item->header); @@ -308,7 +321,7 @@ private function assertContentEquals($iterator, $expectedHeaders) private function getBundleMapping() { return [ - 'ONGRTestingBundle:Content' => [ + 'AcmeTestBundle:Content' => [ 'setters' => [ 'header' => [ 'exec' => false, @@ -318,7 +331,7 @@ private function getBundleMapping() 'properties' => [ 'header' => ['type' => 'string'] ], - 'namespace' => 'ONGR\TestingBundle\Document\Content', + 'namespace' => 'ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document\Content', ], ]; } @@ -330,6 +343,6 @@ private function getBundleMapping() */ private function getTypesMapping() { - return ['content' => 'ONGRTestingBundle:Content']; + return ['content' => 'AcmeTestBundle:Content']; } } diff --git a/Tests/Unit/Result/Suggestion/Option/CompletionOptionTest.php b/Tests/Unit/Result/Suggestion/Option/CompletionOptionTest.php new file mode 100644 index 00000000..c6c603d3 --- /dev/null +++ b/Tests/Unit/Result/Suggestion/Option/CompletionOptionTest.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Unit\Result\Suggestion; + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\CompletionOption; + +/** + * Unit tests for completion option. + */ +class CompletionOptionTest extends \PHPUnit_Framework_TestCase +{ + /** + * Check if getters works as expected. + */ + public function testGetters() + { + $completion = new CompletionOption('test', 1.0, ['my' => 'test']); + $this->assertEquals('test', $completion->getText()); + $this->assertEquals(1.0, $completion->getScore()); + $this->assertEquals(['my' => 'test'], $completion->getPayload()); + } +} diff --git a/Tests/Unit/Result/Suggestion/Option/PhraseOptionTest.php b/Tests/Unit/Result/Suggestion/Option/PhraseOptionTest.php new file mode 100644 index 00000000..fa8c544e --- /dev/null +++ b/Tests/Unit/Result/Suggestion/Option/PhraseOptionTest.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Unit\Result\Suggestion; + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\PhraseOption; + +/** + * Unit tests for completion option. + */ +class PhraseOptionTest extends \PHPUnit_Framework_TestCase +{ + /** + * Check if getters works as expected. + */ + public function testGetters() + { + $option = new PhraseOption('test', 1.0, 'highlighted'); + $this->assertEquals('highlighted', $option->getHighlighted()); + } +} diff --git a/Tests/Unit/Result/Suggestion/Option/TermOptionTest.php b/Tests/Unit/Result/Suggestion/Option/TermOptionTest.php new file mode 100644 index 00000000..89bd1f4c --- /dev/null +++ b/Tests/Unit/Result/Suggestion/Option/TermOptionTest.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Unit\Result\Suggestion; + +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\CompletionOption; +use ONGR\ElasticsearchBundle\Result\Suggestion\Option\TermOption; + +/** + * Unit tests for completion option. + */ +class TermOptionTest extends \PHPUnit_Framework_TestCase +{ + /** + * Check if getters works as expected. + */ + public function testGetters() + { + $option = new TermOption('test', 1.0, 2.0); + $this->assertEquals(2.0, $option->getFreq()); + } +} diff --git a/Tests/Unit/Result/Suggestion/OptionIteratorTest.php b/Tests/Unit/Result/Suggestion/OptionIteratorTest.php new file mode 100644 index 00000000..c2ca71a5 --- /dev/null +++ b/Tests/Unit/Result/Suggestion/OptionIteratorTest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Unit\Result\Suggestion; + +use ONGR\ElasticsearchBundle\Result\Suggestion\OptionIterator; + +/** + * Unit tests for options iterator. + */ +class OptionIteratorTest extends \PHPUnit_Framework_TestCase +{ + /** + * Check if offset get returns null if it's not set. + */ + public function testOffsetGet() + { + $iterator = new OptionIterator([]); + $this->assertNull($iterator['test']); + } + + /** + * Check if offset set throws an exception. + * + * @expectedException \LogicException + * @expectedExceptionMessage Data of this iterator can not be changed after initialization. + */ + public function testOffsetUnset() + { + $highlight = new OptionIterator([]); + $highlight->offsetUnset('test'); + } + + /** + * Check if offset set throws an exception. + * + * @expectedException \LogicException + * @expectedExceptionMessage Data of this iterator can not be changed after initialization. + */ + public function testOffsetSet() + { + $highlight = new OptionIterator([]); + $highlight->offsetSet('test', 'test'); + } +} diff --git a/Tests/Unit/Result/Suggestion/SuggestionIteratorTest.php b/Tests/Unit/Result/Suggestion/SuggestionIteratorTest.php new file mode 100644 index 00000000..b3d3cb8e --- /dev/null +++ b/Tests/Unit/Result/Suggestion/SuggestionIteratorTest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\Unit\Result\Suggestion; + +use ONGR\ElasticsearchBundle\Result\Suggestion\SuggestionIterator; + +/** + * Unit tests for suggestion iterator. + */ +class SuggestionIteratorTest extends \PHPUnit_Framework_TestCase +{ + /** + * Check if offset get returns null if it's not set. + */ + public function testOffsetGet() + { + $iterator = new SuggestionIterator([]); + $this->assertNull($iterator['test']); + } + + /** + * Check if offset set throws an exception. + * + * @expectedException \LogicException + * @expectedExceptionMessage Data of this iterator can not be changed after initialization. + */ + public function testOffsetUnset() + { + $highlight = new SuggestionIterator([]); + $highlight->offsetUnset('test'); + } + + /** + * Check if offset set throws an exception. + * + * @expectedException \LogicException + * @expectedExceptionMessage Data of this iterator can not be changed after initialization. + */ + public function testOffsetSet() + { + $highlight = new SuggestionIterator([]); + $highlight->offsetSet('test', 'test'); + } +} diff --git a/Tests/Unit/Result/SuggestionsTest.php b/Tests/Unit/Result/SuggestionsTest.php deleted file mode 100644 index 89aed6f9..00000000 --- a/Tests/Unit/Result/SuggestionsTest.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace ONGR\ElasticsearchBundle\Tests\Unit\Result; - -use ONGR\ElasticsearchBundle\Result\Suggestions; - -class SuggestionsTest extends \PHPUnit_Framework_TestCase -{ - /** - * Returns sample data for tests. - * - * @return array - */ - protected function getTestData() - { - return [ - 'foo' => [ - 'text' => 'foobar', - 'offset' => 0, - 'length' => 6, - 'options' => [ - [ - 'text' => 'foobar', - 'freq' => 77, - 'score' => 0.8888889, - ], - ], - ], - 'bar' => [ - 'text' => 'barbaz', - 'offset' => 0, - 'length' => 6, - 'options' => [], - ], - ]; - } - - /** - * Test for \ArrayAccess interface implementation. - */ - public function testArrayAccess() - { - $iterator = new Suggestions($this->getTestData()); - - $this->assertEquals($this->getTestData()['foo'], $iterator->offsetGet('foo')); - $this->assertEquals($this->getTestData()['bar'], $iterator->offsetGet('bar')); - - // Should return NULL if key does not exist. - $this->assertNull($iterator->offsetGet('baz')); - } - - /** - * Test for offsetSet(). - * - * @expectedException \LogicException - */ - public function testOffsetSet() - { - $iterator = new Suggestions([]); - $iterator->offsetSet('foo', 'bar'); - } - - /** - * Test for offsetUnset(). - * - * @expectedException \LogicException - */ - public function testOffsetUnset() - { - $iterator = new Suggestions([]); - $iterator->offsetUnset('foo'); - } -} diff --git a/Tests/Unit/Service/JsonFormatterTest.php b/Tests/Unit/Service/JsonFormatterTest.php index 5866293a..b7d819b4 100644 --- a/Tests/Unit/Service/JsonFormatterTest.php +++ b/Tests/Unit/Service/JsonFormatterTest.php @@ -85,7 +85,7 @@ public function testPrettify($inlineJson, $prettyJson) */ private function getFileContents($filename) { - $contents = file_get_contents(__DIR__ . '/../../app/fixtures/JsonFormatter/' . $filename); + $contents = file_get_contents(__DIR__ . '/../../app/fixture/JsonFormatter/' . $filename); // Checks for new line at the end of file. if (substr($contents, -1) == "\n") { diff --git a/Tests/app/AppKernel.php b/Tests/app/AppKernel.php index 085ad4c7..f8257130 100644 --- a/Tests/app/AppKernel.php +++ b/Tests/app/AppKernel.php @@ -27,7 +27,7 @@ public function registerBundles() return [ new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new ONGR\ElasticsearchBundle\ONGRElasticsearchBundle(), - new ONGR\TestingBundle\ONGRTestingBundle(), + new ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\AcmeTestBundle(), ]; } diff --git a/Tests/app/config/config_test.yml b/Tests/app/config/config_test.yml index de06fb4f..eefc7331 100644 --- a/Tests/app/config/config_test.yml +++ b/Tests/app/config/config_test.yml @@ -24,7 +24,7 @@ ongr_elasticsearch: connection: default debug: true mappings: - - ONGRTestingBundle + - AcmeTestBundle bar: connection: bar mappings: diff --git a/Tests/app/fixture/Acme/TestBundle/AcmeTestBundle.php b/Tests/app/fixture/Acme/TestBundle/AcmeTestBundle.php new file mode 100644 index 00000000..dbb07da0 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/AcmeTestBundle.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle; + +use Symfony\Component\HttpKernel\Bundle\Bundle; + +/** + * AcmeTestBundle for testing. + */ +class AcmeTestBundle extends Bundle +{ + +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/Category.php b/Tests/app/fixture/Acme/TestBundle/Document/Category.php new file mode 100644 index 00000000..c08a5061 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/Category.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * Category document for testing. + * + * @ES\Object + */ +class Category +{ + + public $hiddenField; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/CdnObject.php b/Tests/app/fixture/Acme/TestBundle/Document/CdnObject.php new file mode 100644 index 00000000..675405c5 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/CdnObject.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * CdnObject document for testing. + * + * @ES\Object + */ +class CdnObject +{ + /** + * @var string + * + * @ES\Property(name="cdn_url", type="string") + */ + public $cdn_url; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/Comment.php b/Tests/app/fixture/Acme/TestBundle/Document/Comment.php new file mode 100644 index 00000000..eb13c59e --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/Comment.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; +use ONGR\ElasticsearchBundle\Document\DocumentInterface; +use ONGR\ElasticsearchBundle\Document\DocumentTrait; + +/** + * Comment document for testing. + * + * @ES\Document(type="comment", parent="AcmeTestBundle:Content", ttl={"enabled":true, "default": "1d"}) + */ +class Comment implements DocumentInterface +{ + use DocumentTrait; + + /** + * @var string + * + * @ES\Property(type="string", name="userName") + */ + public $userName; + + /** + * @var \DateTime + * + * @ES\Property(name="createdAt", type="date") + */ + private $createdAt; + + /** + * Constructor. + */ + public function __construct() + { + $this->createdAt = new \DateTime(); + } + + /** + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->createdAt; + } + + /** + * @param \DateTime $createdAt + */ + public function setCreatedAt(\DateTime $createdAt) + { + $this->createdAt = $createdAt; + } +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/CompletionSuggesting.php b/Tests/app/fixture/Acme/TestBundle/Document/CompletionSuggesting.php new file mode 100644 index 00000000..12661be2 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/CompletionSuggesting.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; +use ONGR\ElasticsearchBundle\Document\Suggester\CompletionSuggesterInterface; +use ONGR\ElasticsearchBundle\Document\Suggester\CompletionSuggesterTrait; + +/** + * Suggesting document for testing. + * + * @ES\Object + */ +class CompletionSuggesting implements CompletionSuggesterInterface +{ + use CompletionSuggesterTrait; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/Content.php b/Tests/app/fixture/Acme/TestBundle/Document/Content.php new file mode 100644 index 00000000..c171ebfc --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/Content.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; +use ONGR\ElasticsearchBundle\Document\DocumentInterface; +use ONGR\ElasticsearchBundle\Document\DocumentTrait; + +/** + * Content document for testing. + * + * @ES\Document(type="fooContent") + */ +class Content implements DocumentInterface +{ + use DocumentTrait; + + /** + * @var string + * + * @ES\Property(type="string", name="header") + */ + public $header; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/ImagesNested.php b/Tests/app/fixture/Acme/TestBundle/Document/ImagesNested.php new file mode 100644 index 00000000..b0c1d619 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/ImagesNested.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * Images nested document for testing. + * + * @ES\Nested + */ +class ImagesNested +{ + /** + * @var string + * + * @ES\Property(name="url", type="string") + */ + public $url; + + /** + * @var string + * + * + * @ES\Property(name="title", type="string", index="no") + */ + public $title; + + /** + * @var string + * + * @ES\Property(name="description", type="string", index="no") + */ + public $description; + + /** + * @var object + * + * @ES\Property(name="cdn", type="object", objectName="AcmeTestBundle:CdnObject") + */ + public $cdn; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/PriceLocationContext.php b/Tests/app/fixture/Acme/TestBundle/Document/PriceLocationContext.php new file mode 100644 index 00000000..5eaf202f --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/PriceLocationContext.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * SuggestingContext document for testing. + * + * @ES\Object + */ +class PriceLocationContext +{ + /** + * @var string + * + * @ES\Property(name="price", type="string") + */ + public $price; + + /** + * @var array + * + * @ES\Property(name="location", type="string") + */ + public $location; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/PriceLocationSuggesting.php b/Tests/app/fixture/Acme/TestBundle/Document/PriceLocationSuggesting.php new file mode 100644 index 00000000..3fcfd73a --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/PriceLocationSuggesting.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; +use ONGR\ElasticsearchBundle\Document\Suggester\ContextSuggesterInterface; +use ONGR\ElasticsearchBundle\Document\Suggester\ContextSuggesterTrait; + +/** + * Suggesting document for testing. + * + * @ES\Object + */ +class PriceLocationSuggesting implements ContextSuggesterInterface +{ + use ContextSuggesterTrait; + + /** + * @var object + * + * @ES\Property(type="object", objectName="AcmeTestBundle:PriceLocationContext", name="context") + */ + private $context; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/Product.php b/Tests/app/fixture/Acme/TestBundle/Document/Product.php new file mode 100644 index 00000000..fc528a3f --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/Product.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; +use ONGR\ElasticsearchBundle\Document\DocumentInterface; +use ONGR\ElasticsearchBundle\Document\DocumentTrait; + +/** + * Product document for testing. + * + * @ES\Document(type="product") + */ +class Product implements DocumentInterface +{ + use DocumentTrait; + + /** + * @var string + * + * @ES\Property(type="string", name="title", fields={@ES\MultiField(name="raw", type="string")}) + */ + public $title; + + /** + * @var string + * + * @ES\Property(type="string", name="description") + */ + public $description; + + /** + * @var PriceLocationSuggesting + * + * @ES\Suggester\ContextSuggesterProperty( + * name = "suggestions", + * objectName = "AcmeTestBundle:PriceLocationSuggesting", + * payloads = true, + * context = { + * @ES\Suggester\Context\GeoLocationContext(name="location", precision = "5m", neighbors = true, default = "u33"), + * @ES\Suggester\Context\CategoryContext(name="price", default = {"red", "green"}, path = "description") + * } + * ) + */ + public $contextSuggesting; + + /** + * @var CompletionSuggesting + * + * @ES\Suggester\CompletionSuggesterProperty( + * name = "completion_suggesting", + * objectName = "AcmeTestBundle:CompletionSuggesting", + * index_analyzer = "simple", + * search_analyzer = "simple", + * payloads = false, + * ) + */ + public $completionSuggesting; + + /** + * @var float + * + * @ES\Property(type="float", name="price") + */ + public $price; + + /** + * @var string + * + * @ES\Property(type="geo_point", name="location") + */ + public $location; + + /** + * @var UrlObject[]|\Iterator + * + * @ES\Property(type="object", objectName="AcmeTestBundle:UrlObject", multiple=true, name="url") + */ + public $links; + + /** + * @var ImagesNested[]|\Iterator + * + * @ES\Property(type="nested", objectName="AcmeTestBundle:ImagesNested", multiple=true, name="images") + */ + public $images; + + /** + * @var Category[]|\Iterator + * + * @ES\Property(type="object", objectName="AcmeTestBundle:Category", multiple=true, name="categories") + */ + public $categories; +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/UrlObject.php b/Tests/app/fixture/Acme/TestBundle/Document/UrlObject.php new file mode 100644 index 00000000..3354ff53 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/UrlObject.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace ONGR\ElasticsearchBundle\Tests\app\fixture\Acme\TestBundle\Document; + +use ONGR\ElasticsearchBundle\Annotation as ES; + +/** + * UrlObject document for testing. + * + * @ES\Object + */ +class UrlObject +{ + /** + * @var string + * + * @ES\Property(name="url", type="string") + */ + public $url; + + /** + * @var string + * + * @ES\Property(name="key", type="string", index="no") + */ + public $urlKey; + + /** + * @var CdnObject + * + * @ES\Property(name="cdn", type="object", objectName="AcmeTestBundle:CdnObject") + */ + public $cdn; + + /** + * @param string $urlKey + */ + public function setUrlKey($urlKey) + { + $this->urlKey = $urlKey; + } + + /** + * @return string + */ + public function getUrlKey() + { + return $this->urlKey; + } +} diff --git a/Tests/app/fixture/Acme/TestBundle/Document/documentSample.txt b/Tests/app/fixture/Acme/TestBundle/Document/documentSample.txt new file mode 100644 index 00000000..8f4fdc53 --- /dev/null +++ b/Tests/app/fixture/Acme/TestBundle/Document/documentSample.txt @@ -0,0 +1,22 @@ +