Author: dr
Date: Mon Mar 3 15:47:15 2008
New Revision: 7498
Log:
- Some refactoring.
Added:
trunk/Search/src/abstraction/implementations/
Removed:
trunk/Search/src/abstraction/query.php
Modified:
trunk/Search/design/class_diagram.png
trunk/Search/src/abstraction/query_find.php
trunk/Search/src/handlers/solr.php
trunk/Search/src/managers/xml_manager.php
trunk/Search/src/search_autoload.php
trunk/Search/src/search_session.php
trunk/Search/src/structs/document_definition.php
trunk/Search/tests/managers/testfiles/article.xml
trunk/Search/tests/managers/xml_test.php
trunk/Search/tests/session_test.php
Modified: trunk/Search/design/class_diagram.png
==============================================================================
Binary files - no diff available.
Modified: trunk/Search/src/abstraction/query_find.php
==============================================================================
--- trunk/Search/src/abstraction/query_find.php [iso-8859-1] (original)
+++ trunk/Search/src/abstraction/query_find.php [iso-8859-1] Mon Mar 3
15:47:15 2008
@@ -15,97 +15,8 @@
* @version //autogentag//
* @mainclass
*/
-class ezcSearchFindQuery extends ezcSearchQuery
+interface ezcSearchFindQuery extends ezcSearchQuery
{
- /**
- * Sort the result ascending.
- */
- const ASC = 'ASC';
-
- /**
- * Sort the result descending.
- */
- const DESC = 'DESC';
-
- /**
- * Stores the SELECT part of the SQL.
- *
- * Everything from 'SELECT' until 'FROM' is stored.
- * @var string
- */
- protected $selectString = null;
-
- /**
- * Stores the FROM part of the SQL.
- *
- * Everything from 'FROM' until 'WHERE' is stored.
- * @var string
- */
- protected $fromString = null;
-
- /**
- * Stores the WHERE part of the SQL.
- *
- * Everything from 'WHERE' until 'GROUP', 'LIMIT', 'ORDER' or 'SORT' is
stored.
- * @var string
- */
- protected $whereString = null;
-
- /**
- * Stores the FACET part of SQL
- *
- * @var string
- */
- protected $facetString = null;
-
- /**
- * Stores the ORDER BY part of the SQL.
- *
- * @var string
- */
- protected $orderString = null;
-
- /**
- * Stores the LIMIT part of the SQL.
- *
- * @var string
- */
- protected $limitString = null;
-
- /**
- * Stores the name of last invoked SQL clause method.
- *
- * Could be 'select', 'from', 'where', 'group', 'having', 'order', 'limit'
- * @var string
- */
- protected $lastInvokedMethod = null;
-
- /**
- * Constructs a new ezcSearchQuery object.
- *
- * @param ezcSearchHandler $handler a pointer to the search backend
- */
- public function __construct( ezcSearchHandler $handler )
- {
- parent::__construct( $handler );
- }
-
- /**
- * Resets the query object for reuse.
- *
- * @return void
- */
- public function reset()
- {
- $this->selectString = null;
- $this->fromString = null;
- $this->whereString = null;
- $this->facetString = null;
- $this->orderString = null;
- $this->limitString = null;
- $this->lastInvokedClauseMethod = null;
- }
-
/**
* Opens the query and selects which columns you want to return with
* the query.
@@ -137,167 +48,7 @@
* @param string|array(string) $... Either a string with a column name or
an array of column names.
* @return ezcQuery returns a pointer to $this.
*/
- public function select()
- {
- if ( $this->selectString == null )
- {
- $this->selectString = 'SELECT ';
- }
-
- $args = func_get_args();
- $cols = self::arrayFlatten( $args );
-
- if ( count( $cols ) < 1 )
- {
- throw new ezcQueryVariableParameterException( 'select', count(
$args ), 1 );
- }
- $this->lastInvokedMethod = 'select';
- $cols = $this->getIdentifiers( $cols );
-
- // glue string should be inserted each time but not before first entry
- if ( ( $this->selectString !== 'SELECT ' ) &&
- ( $this->selectString !== 'SELECT DISTINCT ' ) )
- {
- $this->selectString .= ', ';
- }
-
- $this->selectString .= join( ', ', $cols );
- return $this;
- }
-
- /**
- * Adds a where clause with logical expressions to the query.
- *
- * where() accepts an arbitrary number of parameters. Each parameter
- * must contain a logical expression or an array with logical expressions.
- * If you specify multiple logical expression they are connected using
- * a logical and.
- *
- * Multiple calls to where() will join the expressions using a logical and.
- *
- * Example:
- * <code>
- * $q->select( '*' )->from( 'table' )->where( $q->expr->eq( 'id', 1 ) );
- * </code>
- *
- * @throws ezcQueryVariableParameterException if called with no parameters.
- * @param string|array(string) $... Either a string with a logical
expression name
- * or an array with logical expressions.
- * @return ezcQuerySelect
- */
- public function where()
- {
- if ( $this->whereString == null )
- {
- $this->whereString = 'WHERE ';
- }
-
- $args = func_get_args();
- $expressions = self::arrayFlatten( $args );
- if ( count( $expressions ) < 1 )
- {
- throw new ezcQueryVariableParameterException( 'where', count(
$args ), 1 );
- }
-
- $this->lastInvokedMethod = 'where';
-
- // glue string should be inserted each time but not before first entry
- if ( $this->whereString != 'WHERE ' )
- {
- $this->whereString .= ' AND ';
- }
-
- $this->whereString .= join( ' AND ', $expressions );
- return $this;
- }
-
-
- /**
- * Returns SQL that limits the result set.
- *
- * $limit controls the maximum number of rows that will be returned.
- * $offset controls which row that will be the first in the result
- * set from the total amount of matching rows.
- *
- * Example:
- * <code>
- * $q->select( '*' )->from( 'table' )
- * ->limit( 10, 0 );
- * </code>
- *
- * LIMIT is not part of SQL92. It is implemented here anyway since all
- * databases support it one way or the other and because it is
- * essential.
- *
- * @param string $limit integer expression
- * @param string $offset integer expression
- * @return ezcQuerySelect
- */
- public function limit( $limit, $offset = '' )
- {
- if ( $offset === '' )
- {
- $this->limitString = "LIMIT {$limit}";
- }
- else
- {
- $this->limitString = "LIMIT {$limit} OFFSET {$offset}";
- }
- $this->lastInvokedMethod = 'limit';
-
- return $this;
- }
-
- /**
- * Returns SQL that orders the result set by a given column.
- *
- * You can call orderBy multiple times. Each call will add a
- * column to order by.
- *
- * Example:
- * <code>
- * $q->select( '*' )->from( 'table' )
- * ->orderBy( 'id' );
- * </code>
- *
- * @param string $column a column name in the result set
- * @param string $type if the column should be sorted ascending or
descending.
- * you can specify this using ezcQuerySelect::ASC or
ezcQuerySelect::DESC
- * @return ezcQuery a pointer to $this
- */
- public function orderBy( $column, $type = self::ASC )
- {
- $string = $this->getIdentifier( $column );
- if ( $type == self::DESC )
- {
- $string .= ' DESC';
- }
- if ( $this->orderString == '' )
- {
- $this->orderString = "ORDER BY {$string}";
- }
- else
- {
- $this->orderString .= ", {$string}";
- }
- $this->lastInvokedMethod = 'order';
-
- return $this;
- }
-
- /**
- * Returns the complete select query string.
- *
- * This method uses the build methods to build the
- * various parts of the select query.
- *
- * @todo add newlines? easier for debugging
- * @throws ezcQueryInvalidException if it was not possible to build a
valid query.
- * @return string
- */
- public function getQuery()
- {
- }
+ public function select();
}
?>
Modified: trunk/Search/src/handlers/solr.php
==============================================================================
--- trunk/Search/src/handlers/solr.php [iso-8859-1] (original)
+++ trunk/Search/src/handlers/solr.php [iso-8859-1] Mon Mar 3 15:47:15 2008
@@ -248,6 +248,7 @@
}
$result = $this->sendRawGetCommand( 'select', $queryFlags );
+ var_dump($result);
$result = json_decode( $result );
return ezcSearchResult::createFromResponse( $result );
}
@@ -262,26 +263,85 @@
return 'solr';
}
- public function createFindQuery( $type = false )
- {
+ /**
+ * Creates a search query object with the fields from the definition
filled in.
+ *
+ * @param string $type
+ * @return ezcSearchFindQuery
+ */
+ public function createFindQuery( $type = false,
ezcSearchDocumentDefinition $definition = null )
+ {
+ $query = new ezcSearchFindQuerySolr( $this, $definition );
+ $query->select( 'score' );
+ if ( $type )
+ {
+ $selectFieldNames = array();
+ foreach ( $definition->getSelectFieldNames() as $docProp )
+ {
+ $selectFieldNames[] = $this->mapFieldType( $docProp,
$definition->fields[$docProp]->type );
+ }
+ $query->select( $selectFieldNames );
+ $query->where( $query->eq( 'ezcsearch_type_s', $type ) );
+ }
+ return $query;
}
public function find( ezcSearchFindQuery $query )
{
- }
-
- private function mapFieldType( $name, $type )
+ $queryWord = join( ' ', $query->whereClauses );
+ $resultFieldList = $query->resultFields;
+
+ return $this->search( $queryWord, '', array(), $resultFieldList );
+ }
+
+ public function mapFieldType( $name, $type )
{
$map = array(
ezcSearchDocumentDefinition::STRING => '_s',
ezcSearchDocumentDefinition::TEXT => '_t',
ezcSearchDocumentDefinition::HTML => '_t',
- ezcSearchDocumentDefinition::DATE => '_dt',
+ ezcSearchDocumentDefinition::DATE => '_l',
);
return $name . $map[$type];
}
- private function mapFieldValue( $field, $values )
+ public function mapFieldValue( $field, $value )
+ {
+ switch ( $field->type )
+ {
+ case ezcSearchDocumentDefinition::STRING:
+ case ezcSearchDocumentDefinition::TEXT:
+ case ezcSearchDocumentDefinition::HTML:
+ $value = trim( $value );
+ if ( strpbrk( $value, ' "' ) !== false )
+ {
+ $value = '"' . str_replace( '"', '\"', $value ) . '"';
+ }
+ break;
+
+ case ezcSearchDocumentDefinition::DATE:
+ if ( is_numeric( $value ) )
+ {
+ $d = new DateTime( "@$value" );
+ $value = $d->format( 'U' );
+ }
+ else
+ {
+ try
+ {
+ $d = new DateTime( $value );
+ }
+ catch ( Exception $e )
+ {
+ throw new ezcSearchInvalidValueException( $type,
$value );
+ }
+ $value = $d->format( 'U' );
+ }
+ }
+ return $value;
+ }
+
+ public function mapFieldValues( $field, $values )
{
if ( !is_array( $values ) )
{
@@ -289,27 +349,7 @@
}
foreach ( $values as &$value )
{
- switch( $field->type )
- {
- case ezcSearchDocumentDefinition::DATE:
- if ( is_numeric( $value ) )
- {
- $d = new DateTime( "@$value" );
- $value = $d->format( 'Y-m-d\TH:i:s\Z' );
- }
- else
- {
- try
- {
- $d = new DateTime( $value );
- }
- catch ( Exception $e )
- {
- throw new ezcSearchInvalidValueException( $type,
$value );
- }
- $value = $d->format( 'Y-m-d\TH:i:s\Z' );
- }
- }
+ $value = $this->mapFieldValue( $field, $value );
}
return $values;
}
@@ -328,13 +368,20 @@
$xml->openMemory();
$xml->startElement( 'add' );
$xml->startElement( 'doc' );
+
+ $xml->startElement( 'field' );
+ $xml->writeAttribute( 'name', 'ezcsearch_type_s' );
+ $xml->text( $definition->documentType );
+ $xml->endElement();
+
$xml->startElement( 'field' );
$xml->writeAttribute( 'name', 'id' );
$xml->text( $document[$definition->idProperty] );
$xml->endElement();
+
foreach ( $definition->fields as $field )
{
- $value = $this->mapFieldValue( $field, $document[$field->field] );
+ $value = $this->mapFieldValues( $field, $document[$field->field] );
foreach ( $value as $fieldValue )
{
$xml->startElement( 'field' );
Modified: trunk/Search/src/managers/xml_manager.php
==============================================================================
--- trunk/Search/src/managers/xml_manager.php [iso-8859-1] (original)
+++ trunk/Search/src/managers/xml_manager.php [iso-8859-1] Mon Mar 3 15:47:15
2008
@@ -70,7 +70,7 @@
private function parseDefinitionXml( $documentType, $path,
SimpleXMLElement $s )
{
- $def = new ezcSearchDocumentDefinition;
+ $def = new ezcSearchDocumentDefinition( $documentType );
foreach ( $s->field as $field )
{
@@ -88,7 +88,12 @@
throw new ezcSearchDefinitionInvalidException( 'XML',
$documentType, $path, "Unknown type: {$type}" );
}
$type = $this->typeMap[$type];
- $fields[(string) $field] = new ezcSearchDefinitionDocumentField(
(string) $field, $type, (float) $field['boost'], (bool) $field['inResult'] );
+ $boost = (float) $field['boost'];
+ if ( $boost == 0 )
+ {
+ $boost = 1;
+ }
+ $fields[(string) $field] = new ezcSearchDefinitionDocumentField(
(string) $field, $type, $boost, ((string) $field['inResult']) !== 'false' );
}
$def->fields = $fields;
Modified: trunk/Search/src/search_autoload.php
==============================================================================
--- trunk/Search/src/search_autoload.php [iso-8859-1] (original)
+++ trunk/Search/src/search_autoload.php [iso-8859-1] Mon Mar 3 15:47:15 2008
@@ -16,17 +16,19 @@
'ezcSearchDefinitionMissingIdPropertyException' =>
'Search/exceptions/missing_id.php',
'ezcSearchDefinitionNotFoundException' =>
'Search/exceptions/definition_not_found.php',
'ezcSearchTransactionException' =>
'Search/exceptions/transaction.php',
+ 'ezcSearchQuery' =>
'Search/abstraction/query.php',
'ezcSearchDefinitionManager' =>
'Search/interfaces/definition_manager.php',
+ 'ezcSearchFindQuery' =>
'Search/abstraction/query_find.php',
'ezcSearchHandler' =>
'Search/interfaces/handler.php',
'ezcSearchIndexHandler' =>
'Search/interfaces/index_handler.php',
- 'ezcSearchQuery' =>
'Search/abstraction/query.php',
'ezcSearchCodeManager' =>
'Search/managers/code_manager.php',
'ezcSearchDefinitionDocumentField' =>
'Search/structs/document_field_definition.php',
'ezcSearchDeleteHandler' =>
'Search/handlers/delete_handler.php',
'ezcSearchDocumentDefinition' =>
'Search/structs/document_definition.php',
'ezcSearchFindHandler' =>
'Search/handlers/find_handler.php',
- 'ezcSearchFindQuery' =>
'Search/abstraction/query_find.php',
+ 'ezcSearchFindQuerySolr' =>
'Search/abstraction/implementations/find_solr.php',
'ezcSearchQueryInsert' =>
'Search/abstraction/query_index.php',
+ 'ezcSearchQueryTools' =>
'Search/abstraction/query_tools.php',
'ezcSearchResult' =>
'Search/search_result.php',
'ezcSearchSession' =>
'Search/search_session.php',
'ezcSearchSessionInstance' =>
'Search/search_session_instance.php',
Modified: trunk/Search/src/search_session.php
==============================================================================
--- trunk/Search/src/search_session.php [iso-8859-1] (original)
+++ trunk/Search/src/search_session.php [iso-8859-1] Mon Mar 3 15:47:15 2008
@@ -80,9 +80,9 @@
*
* @return array(object($class))
*/
- public function find( ezcSearchQuery $query, $type )
- {
- return $this->findHandler->find( $query, $type );
+ public function find( ezcSearchQuery $query )
+ {
+ return $this->handler->find( $query );
}
/**
@@ -108,7 +108,7 @@
*/
public function findIterator( ezcQuerySelect $query, $type )
{
- return $this->findHandler->findIterator( $query, $type );
+ return $this->handler->findIterator( $query, $type );
}
/**
@@ -127,11 +127,13 @@
*
* @param string $type
*
- * @return ezcQuerySelect
+ * @return ezcSearchFindQuery
*/
public function createFindQuery( $type )
{
- return $this->findHandler->createFindQuery( $type );
+ $def = $this->definitionManager->fetchDefinition( $type );
+
+ return $this->handler->createFindQuery( $type, $def );
}
/**
@@ -267,11 +269,8 @@
{
switch ( $name )
{
- case 'database':
case 'definitionManager':
- case 'findHandler':
- case 'indexHandler':
- case 'deleteHandler':
+ case 'handler':
throw new ezcBasePropertyPermissionException( $name,
ezcBasePropertyPermissionException::READ );
default:
Modified: trunk/Search/src/structs/document_definition.php
==============================================================================
--- trunk/Search/src/structs/document_definition.php [iso-8859-1] (original)
+++ trunk/Search/src/structs/document_definition.php [iso-8859-1] Mon Mar 3
15:47:15 2008
@@ -6,12 +6,31 @@
const HTML = 3;
const DATE = 4;
+ public $documentType;
public $idProperty = null;
public $fields = array();
+
+ public function __construct( $documentType )
+ {
+ $this->documentType = strtolower( $documentType );
+ }
public function getFieldNames()
{
return array_keys( $this->fields );
}
+
+ public function getSelectFieldNames()
+ {
+ $fields = array();
+ foreach ( $this->fields as $name => $def )
+ {
+ if ( $def->inResult )
+ {
+ $fields[] = $name;
+ }
+ }
+ return $fields;
+ }
}
?>
Modified: trunk/Search/tests/managers/testfiles/article.xml
==============================================================================
--- trunk/Search/tests/managers/testfiles/article.xml [iso-8859-1] (original)
+++ trunk/Search/tests/managers/testfiles/article.xml [iso-8859-1] Mon Mar 3
15:47:15 2008
@@ -2,7 +2,7 @@
<document>
<field type="id">id</field>
<field type="string" boost="2">title</field>
- <field type="text">summary</field>
- <field type="html">body</field>
+ <field inResult="true" type="text">summary</field>
+ <field inResult="false" type="html">body</field>
<field type="date">published</field>
</document>
Modified: trunk/Search/tests/managers/xml_test.php
==============================================================================
--- trunk/Search/tests/managers/xml_test.php [iso-8859-1] (original)
+++ trunk/Search/tests/managers/xml_test.php [iso-8859-1] Mon Mar 3 15:47:15
2008
@@ -104,6 +104,10 @@
self::assertEquals( ezcSearchDocumentDefinition::HTML,
$d->fields['body']->type );
self::assertEquals( ezcSearchDocumentDefinition::DATE,
$d->fields['published']->type );
self::assertEquals( 2, $d->fields['title']->boost );
+
+ self::assertEquals( false, $d->fields['body']->inResult );
+ self::assertEquals( true, $d->fields['summary']->inResult );
+ self::assertEquals( true, $d->fields['title']->inResult );
}
public static function suite()
Modified: trunk/Search/tests/session_test.php
==============================================================================
--- trunk/Search/tests/session_test.php [iso-8859-1] (original)
+++ trunk/Search/tests/session_test.php [iso-8859-1] Mon Mar 3 15:47:15 2008
@@ -85,6 +85,61 @@
$r = $this->backend->search( 'Rethans', 'author_t', array(
'summary_t', 'title_t', 'body_t' ), array( 'author_t', 'title_t', 'score',
'summary_t', 'published_dt' ), array( 'author_t', 'title_t', 'score',
'summary_t' ) );
self::assertEquals( 1, $r->resultCount );
}
+
+ public function testCreateFindQuery1()
+ {
+ $session = new ezcSearchSession( $this->backend, new
ezcSearchXmlManager( $this->testFilesDir ) );
+
+ $a = new Article( null, 'Test Article Eén', 'This is the first
article to test', 'the body of the article', time() );
+ $session->index( $a );
+ $a = new Article( null, 'Test Article Twee', 'This is the second
article to test', 'the body of the article', time() );
+ $session->index( $a );
+
+ $q = $session->createFindQuery( 'article' );
+ $q->where( $q->eq( 'body', 'article' ) )->where( $q->eq( 'title',
'Test' ) );
+
+ $r = $session->find( $q );
+ }
+
+ public function testCreateFindQueryOr()
+ {
+ $session = new ezcSearchSession( $this->backend, new
ezcSearchXmlManager( $this->testFilesDir ) );
+
+ $a = new Article( null, 'Test Article Eén', 'This is the first
article to test', 'the body of the article', time() );
+ $session->index( $a );
+ $a = new Article( null, 'Test Article Twee', 'This is the second
article to test', 'the body of the article', time() );
+ $session->index( $a );
+
+ $q = $session->createFindQuery( 'article' );
+ $q->where( $q->lOr( $q->eq( 'title', 'Nul' ), $q->eq( 'title', 'Drie'
) ) );
+ $r = $session->find( $q );
+
+ $q = $session->createFindQuery( 'article' );
+ $q->where( $q->lOr( $q->eq( 'title', 'Eén' ), $q->eq( 'title', 'Drie'
) ) );
+ $r = $session->find( $q );
+
+ $q = $session->createFindQuery( 'article' );
+ $q->where( $q->lOr( $q->eq( 'title', 'Twee' ), $q->eq( 'title', 'Drie'
) ) );
+ $r = $session->find( $q );
+
+ $q = $session->createFindQuery( 'article' );
+ $q->where( $q->lOr( $q->eq( 'title', 'Eén' ), $q->eq( 'title', 'Twee'
) ) );
+ $r = $session->find( $q );
+ }
+
+ public function testCreateFindQueryNot()
+ {
+ $session = new ezcSearchSession( $this->backend, new
ezcSearchXmlManager( $this->testFilesDir ) );
+
+ $a = new Article( null, 'Test Article Eén', 'This is the first
article to test', 'the body of the article', time() - 86400 );
+ $session->index( $a );
+ $a = new Article( null, 'Test Article Twee', 'This is the second
article to test', 'the body of the article', time() );
+ $session->index( $a );
+
+ $q = $session->createFindQuery( 'article' );
+ $q->where( $q->not( $q->eq( 'title', 'Twee' ) ) );
+ $r = $session->find( $q );
+ }
}
?>
--
svn-components mailing list
[email protected]
http://lists.ez.no/mailman/listinfo/svn-components