1 /** @file localsubmatch.h
2  *  @brief SubMatch class for a local database.
3  */
4 /* Copyright (C) 2006,2007,2009,2010 Olly Betts
5  * Copyright (C) 2007 Lemur Consulting Ltd
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
20  */
21 
22 #ifndef XAPIAN_INCLUDED_LOCALSUBMATCH_H
23 #define XAPIAN_INCLUDED_LOCALSUBMATCH_H
24 
25 #include "database.h"
26 #include "debuglog.h"
27 #include "omqueryinternal.h"
28 #include "submatch.h"
29 #include "xapian/enquire.h"
30 #include "xapian/weight.h"
31 
32 #include <map>
33 
34 class LocalSubMatch : public SubMatch {
35     /// Don't allow assignment.
36     void operator=(const LocalSubMatch &);
37 
38     /// Don't allow copying.
39     LocalSubMatch(const LocalSubMatch &);
40 
41     /// The statistics for the collection.
42     const Xapian::Weight::Internal * stats;
43 
44     /// The original query before any rearrangement.
45     const Xapian::Query::Internal * query;
46 
47     /// The query length (used by some weighting schemes).
48     Xapian::termcount qlen;
49 
50     /// The (sub-)Database we're searching.
51     const Xapian::Database::Internal *db;
52 
53     /** The RSet (used to calculate R and r).
54      *
55      *  R and r are used in probabilistic weighting formulae.
56      */
57     Xapian::RSet rset;
58 
59     /// Weight object (used as a factory by calling create on it).
60     const Xapian::Weight * wt_factory;
61 
62     /// The termfreqs and weights of terms used in orig_query, or NULL.
63     std::map<std::string,
64 	     Xapian::MSet::Internal::TermFreqAndWeight> * term_info;
65 
66   public:
67     /// Constructor.
LocalSubMatch(const Xapian::Database::Internal * db_,const Xapian::Query::Internal * query_,Xapian::termcount qlen_,const Xapian::RSet & rset_,const Xapian::Weight * wt_factory_)68     LocalSubMatch(const Xapian::Database::Internal *db_,
69 		  const Xapian::Query::Internal * query_,
70 		  Xapian::termcount qlen_,
71 		  const Xapian::RSet & rset_,
72 		  const Xapian::Weight *wt_factory_)
73 	: stats(NULL), query(query_), qlen(qlen_), db(db_), rset(rset_),
74 	  wt_factory(wt_factory_), term_info(NULL)
75     {
76 	LOGCALL_CTOR(MATCH, "LocalSubMatch", db_ | query_ | qlen_ | rset_ | wt_factory_);
77     }
78 
79     /// Fetch and collate statistics.
80     bool prepare_match(bool nowait, Xapian::Weight::Internal & total_stats);
81 
82     /// Start the match.
83     void start_match(Xapian::doccount first,
84 		     Xapian::doccount maxitems,
85 		     Xapian::doccount check_at_least,
86 		     const Xapian::Weight::Internal & total_stats);
87 
88     /// Get PostList and term info.
89     PostList * get_postlist_and_term_info(MultiMatch *matcher,
90 	std::map<std::string,
91 		 Xapian::MSet::Internal::TermFreqAndWeight> *termfreqandwts,
92 	Xapian::termcount * total_subqs_ptr);
93 
94     /** Convert a postlist into a synonym postlist.
95      */
96     PostList * make_synonym_postlist(PostList * or_pl, MultiMatch * matcher,
97 				     double factor);
98 
99     /** Convert an OP_LEAF query to a PostList.
100      *
101      *  This is called by QueryOptimiser when it reaches an OP_LEAF query.
102      */
103     PostList * postlist_from_op_leaf_query(const Xapian::Query::Internal *query,
104 					   double factor);
105 };
106 
107 #endif /* XAPIAN_INCLUDED_LOCALSUBMATCH_H */
108