// fts_util.h /** * Copyright (C) 2012 10gen Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * As a special exception, the copyright holders give permission to link the * code of portions of this program with the OpenSSL library under certain * conditions as described in each individual source file and distribute * linked combinations including the program with the OpenSSL library. You * must comply with the GNU Affero General Public License in all respects for * all of the code used other than as permitted herein. If you modify file(s) * with this exception, you may extend this exception to your version of the * file(s), but you are not obligated to do so. If you do not wish to do so, * delete this exception statement from your version. If you delete this * exception statement from all source files in the program, then also delete * it in the license file. */ #pragma once #include #include "mongo/db/hasher.h" #include "mongo/db/jsobj.h" #include "mongo/db/storage/record.h" #include "mongo/util/unordered_fast_key_table.h" namespace mongo { namespace fts { extern const std::string WILDCARD; extern const std::string INDEX_NAME; enum TextIndexVersion { TEXT_INDEX_VERSION_1 = 1, // Legacy index format. Deprecated. TEXT_INDEX_VERSION_2 = 2 // Current index format. }; /** * destructive! */ inline void makeLower( std::string* s ) { std::string::size_type sz = s->size(); for ( std::string::size_type i = 0; i < sz; i++ ) (*s)[i] = (char)tolower( (int)(*s)[i] ); } /* * ScoredLocation stores the total score for a document (record *) wrt a search * */ struct ScoredLocation { ScoredLocation( Record* r, double sc ) : rec(r), score(sc) { } Record* rec; double score; bool operator<( const ScoredLocation& other ) const { if ( other.score < score ) return true; if ( other.score > score ) return false; return rec < other.rec; } }; // scored location comparison is done based on score class ScoredLocationComp { public: bool operator() (const ScoredLocation& lhs, const ScoredLocation& rhs) const { return (lhs.score > rhs.score); } }; struct _be_hash { size_t operator()( const BSONElement& e ) const { return static_cast( BSONElementHasher::hash64( e, 17 ) ); } }; struct _be_equals { bool operator()( const BSONElement& a, const BSONElement& b ) const { return a == b; } }; struct _be_convert { BSONElement operator()( const BSONObj& o ) const { const BSONElement& x = o.firstElement(); BSONElement y( x.rawdata() ); return y; } }; struct _be_convert_other { BSONObj operator()( const BSONElement& e ) const { return e.wrap(); } }; template< typename V > class BSONElementMap : public UnorderedFastKeyTable { }; } }