search.cc
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:4k
- /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
- Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
- Software license is located in file "COPYING"
- */
- #include "search.h"
- int BoolSearchOperation::precedence() const
- {
- return precedence( get_type() );
- }
- int BoolSearchOperation::precedence( SearchItem::type type )
- {
- switch( type )
- {
- case SearchItem::result:
- return 3;
- case SearchItem::and:
- case SearchItem::andnot:
- return 2;
- case SearchItem::or:
- case SearchItem::resultand:
- case SearchItem::resultandnot:
- return 1;
- default:
- return 1;
- }
- }
- BoolSearchOperation *BoolSearchOperation::create_by_childs_and_item
- ( BoolSearchOperation *leftchild, BoolSearchOperation *rightchild,
- const SearchItem &item ) const
- {
- BoolSearchOperation *node = NULL;
- switch( item.get_type() )
- {
- case SearchItem::and:
- case SearchItem::resultand:
- node = new BoolSearchOperationAnd( wordDb );
- break;
- case SearchItem::andnot:
- case SearchItem::resultandnot:
- node = new BoolSearchOperationAndNot( wordDb );
- break;
- case SearchItem::or:
- node = new BoolSearchOperationOr( wordDb );
- break;
- case SearchItem::err:
- default:
- throw GeneralException( "Unsupported bool operation" );
- }
- if( node )
- node->left = leftchild;
- else
- throw GeneralException( "Bool operation error" );
- node->right = rightchild;
-
- return node;
- }
- // static:
- BoolSearchOperation *BoolSearchOperation::merge_search_items
- ( BoolSearchOperation *head, BoolSearchOperation *right,
- const SearchItem &item )
- {
- SearchItem::type type = item.get_type();
- int precedence = head->precedence( type );
-
- if( precedence <= head->precedence() )
- {
- // for example, 'or' is less than 'and', so head with operation 'and'
- // becomes the left child of new 'or' head
-
- BoolSearchOperation *newhead = head->create_by_childs_and_item
- ( head, right, item );
- return newhead;
- }
- else
- {
- // for example we got 'and' after 'or' as the head. 'and' should be
- // propagated to the right child. Recursion
- head->right = merge_search_items( head->right, right, item );
- return head; // unchanged
- }
- }
- // ----------------------------------------------------------------------
- const WordOccurencesT &BoolSearchOperationAnd::get_result()
- {
- if( left == NULL && right == NULL )
- return WordOccurences;
- if( right == NULL )
- {
- WordOccurences = left->get_result();
- delete left;
- left = NULL;
- return WordOccurences;
- }
- const WordOccurencesT &result_left = left->get_result();
- const WordOccurencesT &result_right = right->get_result();
- WordOccurences = wordDb.merge_and( result_left, result_right );
- // only now we can delete old childs
- delete left;
- left = NULL;
- delete right;
- right = NULL;
- return WordOccurences;
- }
- // ----------------------------------------------------------------------
- const WordOccurencesT &BoolSearchOperationAndNot::get_result()
- {
- if( left == NULL && right == NULL )
- return WordOccurences;
-
- if( right == NULL )
- {
- WordOccurences = left->get_result();
- delete left;
- left = NULL;
- return WordOccurences;
- }
- const WordOccurencesT &result_left = left->get_result();
- const WordOccurencesT &result_right = right->get_result();
- WordOccurences = wordDb.merge_and_not( result_left, result_right );
- // only now we can delete old childs
- delete left;
- left = NULL;
- delete right;
- right = NULL;
- return WordOccurences;
- }
- // ----------------------------------------------------------------------
- const WordOccurencesT &BoolSearchOperationOr::get_result()
- {
- if( left == NULL && right == NULL )
- return WordOccurences;
- if( right == NULL )
- {
- WordOccurences = left->get_result();
- delete left;
- left = NULL;
- return WordOccurences;
- }
- const WordOccurencesT &result_left = left->get_result();
- const WordOccurencesT &result_right = right->get_result();
- WordOccurences = wordDb.merge_or( result_left, result_right );
- // only now we can delete old childs
- delete left;
- left = NULL;
- delete right;
- right = NULL;
- return WordOccurences;
- }