$response = $engine->unwriteDocument($doc);
$t->isa_ok($response, 'xfDocument', '->unwriteDocument() returns an xfDocument');
$t->is($response->getGuid(), 'guid', '->unwriteDocument() unwrites the GUID');
$fields = array('isStored' => xfField::STORED, 'isIndexed' => xfField::INDEXED, 'isTokenized' => xfField::TOKENIZED, 'isBinary' => xfField::BINARY);
foreach ($fields as $property => $type) {
    $name = 'test';
    $field = new Zend_Search_Lucene_Field($name, 'bar', 'utf8', false, false, false, false);
    $field->{$property} = true;
    $doc->addField($field);
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('__boosts', serialize(array('test' => 1))));
    $response = $engine->unwriteDocument($doc)->getField('test')->getField()->getType();
    $t->is($response, $type, '->unwriteDocument() can exclusively handle "' . $property . '"');
}
$t->diag('->add()');
$doc = new xfDocument('guid');
$doc->addField(new xfFieldValue(new xfField('name', xfField::KEYWORD), 'carl'));
$doc->addField(new xfFieldValue(new xfField('age', xfField::STORED), 18));
$engine->add($doc);
$engine->commit();
$t->is($engine->count(), 1, '->add() adds a document');
$parent = new xfDocument('parent');
$child = new xfDocument('child');
$pet = new xfDocument('pet');
$parent->addChild($child);
$child->addChild($pet);
$engine->add($parent);
$engine->commit();
$t->is($engine->count(), 4, '->add() adds a document and every subdocument');
$t->diag('->findGuid()');
$doc = $engine->findGuid('guid');
$t->isa_ok($doc, 'xfDocument', '->findGuid() returns an xfDocument');
 * (c) Carl Vondrick <*****@*****.**>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
require dirname(__FILE__) . '/../../bootstrap/unit.php';
require 'util/xfException.class.php';
require 'document/xfDocument.class.php';
require 'document/xfField.class.php';
require 'document/xfFieldValue.class.php';
require 'result/xfDocumentHit.class.php';
require 'result/xfResultException.class.php';
require 'mock/result/xfMockRetort.class.php';
$t = new lime_test(11, new lime_output_color());
$document = new xfDocument('guid');
$document->addField(new xfFieldValue(new xfField('_service', xfField::STORED), 'foo-service'));
$hit = new xfDocumentHit($document, array('score' => 0.2));
$t->diag('->getOption(), ->getOptions(), hasOption(), setOption()');
$t->is($hit->getOption('score'), 0.2, '->getOption() returns the option value');
$t->is($hit->getOption('foobar'), null, '->getOption() returns null for unset options');
$t->is($hit->getOption('foobar', 42), 42, '->getOption() returns the default for unset options');
$t->ok($hit->hasOption('score'), '->hasOption() returns true for options that exist');
$t->ok(!$hit->hasOption('foobar'), '->hasOption() returns false for options that do not exist');
$hit->setOption('foobar', 'baz');
$t->is($hit->getOption('foobar'), 'baz', '->getOption() returns the option value');
$t->is($hit->getOptions(), array('score' => 0.2, 'foobar' => 'baz'), '->getOptions() returns all options');
$t->diag('->getDocument(), ->getServiceName()');
$t->is($hit->getDocument(), $document, '->getDocument() returns the wrapped document');
$t->is($hit->getServiceName(), 'foo-service', '->getServiceName() returns the service name');
$t->diag('->__call()');
$retort = new xfMockRetort();
 * file that was distributed with this source code.
 */
require dirname(__FILE__) . '/../../bootstrap/unit.php';
require 'util/xfException.class.php';
require 'document/xfDocument.class.php';
require 'document/xfFieldValue.class.php';
require 'document/xfField.class.php';
require 'document/xfDocumentException.class.php';
$t = new lime_test(15, new lime_output_color());
$t->diag('->__construct()');
$doc = new xfDocument('guid');
$t->is($doc->getGuid(), 'guid', '->getGuid() returns the document GUID');
$t->is($doc->getFields(), array(), '->getFields() returns an empty array initially');
$t->diag('->addField()');
$value = new xfFieldValue(new xfField('field1', xfField::KEYWORD), 'value');
$doc->addField($value);
$t->is($doc->getField('field1'), $value, '->getField() returns the registered field');
$t->is($doc->getFields(), array('field1' => $value), '->getFields() returns all the fields');
try {
    $msg = '->getField() fails if field name does not exist';
    $doc->getField('foobar');
    $t->fail($msg);
} catch (Exception $e) {
    $t->pass($msg);
}
$t->diag('->hasField()');
$t->ok($doc->hasField('field1'), '->hasField() returns true if the field exists');
$t->ok(!$doc->hasField('field99'), '->hasField() returns false if the field does not exist');
$t->diag('->setBoost(), ->getBoost()');
$doc = new xfDocument('guid');
$t->is($doc->getBoost(), 1.0, '->getBoost() is 1.0 initially');
 * file that was distributed with this source code.
 */
require dirname(__FILE__) . '/../../bootstrap/unit.php';
require 'util/xfLuceneZendManager.class.php';
require 'engine/xfLuceneHits.class.php';
require 'engine/xfEngine.interface.php';
require 'engine/xfLuceneEngine.class.php';
require 'criteria/xfCriterion.interface.php';
require 'result/xfDocumentHit.class.php';
require 'document/xfDocument.class.php';
require 'document/xfField.class.php';
require 'document/xfFieldValue.class.php';
require 'addon/xfLuceneEnhancedFilesystem.class.php';
$t = new lime_test(17, new lime_output_color());
$doc = new xfDocument('foobar');
$doc->addField(new xfFieldValue(new xfField('title', xfField::TEXT), 'foobar'));
$engine = new xfLuceneEngine(dirname(__FILE__) . '/../../sandbox/index');
$engine->erase();
$engine->open();
$engine->add($doc);
$engine->commit();
$zhits = $engine->getIndex()->find('foobar');
$hits = new xfLuceneHits($engine, $zhits);
$t->diag('->current()');
$r = $hits->current();
$t->isa_ok($r, 'xfDocumentHit', '->current() returns an xfDocumentHit');
$t->is($r->getOption('score'), $zhits[0]->score, '->current() returns an xfDocumentHit with correct score');
$t->is($r->getOption('id'), $zhits[0]->id, '->current() returns an xfDocumentHit with correct id');
$t->is($r->getDocument()->getField('title')->getValue(), 'foobar', '->current() communicates with the unwriter correctly');
$t->ok($r === $hits->current(), '->current() caches the response');
$t->diag('->key(), ->next(), ->valid(), ->rewind(), ->seek()');
/**
 * This file is part of the sfSearch package.
 * (c) Carl Vondrick <*****@*****.**>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
require dirname(__FILE__) . '/../../bootstrap/unit.php';
require 'result/xfRetort.interface.php';
require 'result/xfRetortRoute.class.php';
require 'result/xfDocumentHit.class.php';
require 'document/xfDocument.class.php';
require 'document/xfField.class.php';
require 'document/xfFieldValue.class.php';
$doc = new xfDocument('guid');
$doc->addField(new xfFieldValue(new xfField('isbn', xfField::KEYWORD), '1234567890'));
$doc->addField(new xfFieldValue(new xfField('id', xfField::KEYWORD), '42'));
$hit = new xfDocumentHit($doc);
$t = new lime_test(5, new lime_output_color());
$retort = new xfRetortRoute('show/book?id=$id$');
$t->diag('->can()');
$t->ok(!$retort->can($hit, 'getFoo'), '->can() returns false if method does not match');
$t->ok($retort->can($hit, 'getRoute'), '->can() returns true if method does match');
$t->diag('->respond()');
$t->is($retort->respond($hit, 'getRoute'), 'show/book?id=42', '->respond() can do a single replacement');
$retort = new xfRetortRoute('show/book?id=$id$&isbn=$isbn$');
$t->is($retort->respond($hit, 'getRoute'), 'show/book?id=42&isbn=1234567890', '->respond() can do a double replacement');
$t->diag('->setMethod()');
$retort->setMethod('getIt');
$t->ok($retort->can($hit, 'getIt'), '->setMethod() changes the matching method');
require 'result/xfDocumentHit.class.php';
require 'result/xfResultException.class.php';
require 'mock/result/xfMockRetort.class.php';
require 'document/xfDocument.class.php';
require 'document/xfField.class.php';
require 'document/xfFieldValue.class.php';
require 'service/xfServiceRegistry.class.php';
require 'service/xfService.class.php';
require 'mock/service/xfMockIdentifier.class.php';
$service = new xfService(new xfMockIdentifier());
$retort = new xfMockRetort();
$service->addRetort($retort);
$registry = new xfServiceRegistry();
$registry->register($service);
$document = new xfDocument('guid');
$document->addField(new xfFieldValue(new xfField('_service', xfField::KEYWORD), 'foobar'));
$hit = new xfDocumentHit($document);
$array = array($hit, 'foo');
$iterator = new xfResultIterator(new ArrayIterator($array), $registry);
$t = new lime_test(9, new lime_output_color());
$t->diag('->current()');
$response = $iterator->current();
$t->isa_ok($response, 'xfDocumentHit', '->current() returns an xfDocumentHit');
$t->is($response->getDocument(), $document, '->current() returns an xfDocumentHit linked to the original document');
$iterator->next();
try {
    $msg = '->current() throws exception if internal iterator does not return an xfDocumentHit';
    $iterator->current();
    $t->fail($msg);
} catch (Exception $e) {
    $t->pass($msg);
<?php

/**
 * This file is part of the sfSearch package.
 * (c) Carl Vondrick <*****@*****.**>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
require dirname(__FILE__) . '/../../bootstrap/unit.php';
require 'result/xfRetort.interface.php';
require 'result/xfRetortField.class.php';
require 'result/xfDocumentHit.class.php';
require 'document/xfDocument.class.php';
require 'document/xfField.class.php';
require 'document/xfFieldValue.class.php';
require 'util/xfToolkit.class.php';
$doc = new xfDocument('guid');
$doc->addField(new xfFieldValue(new xfField('name', xfField::KEYWORD), 'carl'));
$doc->addField(new xfFieldValue(new xfField('cat_name', xfField::KEYWORD), 'earl'));
$hit = new xfDocumentHit($doc);
$t = new lime_test(5, new lime_output_color());
$retort = new xfRetortField();
$t->diag('->can()');
$t->ok($retort->can($hit, 'getName'), '->can() returns true if method matches a field in the document');
$t->ok(!$retort->can($hit, 'getFoo'), '->can() returns false if method does not match a field in the document');
$t->ok(!$retort->can($hit, 'fetchName'), '->can() returns false if method is invalid syntax');
$t->diag('->respond()');
$t->is($retort->respond($hit, 'getName'), 'carl', '->respond() returns the field response');
$t->is($retort->respond($hit, 'getCatName'), 'earl', '->respond() uses camel case');
 /**
  * Unrewrites a Zend_Search_Lucene document into a xfDocument
  *
  * @param Zend_Search_Lucene_Document $zdoc
  * @returns xfDocument
  */
 public function unwriteDocument(Zend_Search_Lucene_Document $zdoc)
 {
     $doc = new xfDocument($zdoc->getFieldValue('__guid'));
     $boosts = unserialize($zdoc->getFieldValue('__boosts'));
     foreach ($zdoc->getFieldNames() as $name) {
         // ignore internal fields
         if (substr($name, 0, 2) != '__') {
             $zfield = $zdoc->getField($name);
             $type = 0;
             if ($zfield->isStored) {
                 $type |= xfField::STORED;
             }
             if ($zfield->isIndexed) {
                 $type |= xfField::INDEXED;
             }
             if ($zfield->isTokenized) {
                 $type |= xfField::TOKENIZED;
             }
             if ($zfield->isBinary) {
                 $type |= xfField::BINARY;
             }
             $field = new xfField($name, $type);
             $field->setBoost($boosts[$name]);
             $value = new xfFieldValue($field, $zfield->value);
             $doc->addField($value);
         }
     }
     foreach (unserialize($zdoc->getFieldValue('__sub_documents')) as $guid) {
         $doc->addChild($this->findGuid($guid));
     }
     return $doc;
 }
 public function build($input, xfDocument $doc)
 {
     $doc->addField(new xfFieldValue(new xfField('foobar', xfField::KEYWORD), 'bar'));
     $doc->addField(new xfFieldValue(new xfField('input', xfField::TEXT), $input));
     return $doc;
 }