00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _STRUCTQUERYRETMETHOD_HPP
00017 #define _STRUCTQUERYRETMETHOD_HPP
00018
00019 #include "RetrievalMethod.hpp"
00020 #include "StructQueryRep.hpp"
00021 #include "DocumentRep.hpp"
00022 #include "ScoreFunction.hpp"
00023 #include "ScoreAccumulator.hpp"
00024 #include "FreqVector.hpp"
00025
00026
00027
00028
00029
00030
00049 class StructQueryRetMethod : public RetrievalMethod {
00050 public:
00051 StructQueryRetMethod(const Index &ind) : RetrievalMethod(ind) {}
00052 virtual ~StructQueryRetMethod() {}
00054
00055 virtual StructQueryRep *computeStructQueryRep(const TermQuery &qry) = 0;
00056
00058 virtual QueryRep *computeQueryRep(const Query &qry);
00060 virtual double scoreDoc(const QueryRep &qry, DOCID_T docID);
00062 virtual void scoreCollection(const QueryRep &qry, IndexedRealVector &results);
00063
00066 virtual DocumentRep *computeDocRep(DOCID_T docID) = 0;
00068 virtual ScoreFunction *scoreFunc() = 0;
00070 virtual void updateQuery(QueryRep &qryRep, const DocIDSet &relDocs) {
00071 updateStructQuery(*((StructQueryRep *)(&qryRep)), relDocs);
00072 }
00073
00076 virtual void updateStructQuery(StructQueryRep &qryRep,
00077 const DocIDSet &relDocs) = 0;
00078
00080 virtual void scoreInvertedIndex(const QueryRep &qryRep,
00081 IndexedRealVector &scores,
00082 bool scoreAll=false);
00083 };
00084
00086 class StructQueryScoreFunc : public ScoreFunction {
00087 public:
00089 virtual double evalQuery(const QueryNode *qn, const DocumentRep *dRep) {
00090 return qn->eval(dRep);
00091 }
00093 virtual double adjustedScore(double w, const QueryNode *qn) {
00094 return w;
00095 }
00096 };
00097
00098
00099
00100 inline QueryRep *StructQueryRetMethod::computeQueryRep(const Query &qry) {
00101 if (const TermQuery *q = dynamic_cast<const TermQuery *>(&qry))
00102 return (computeStructQueryRep(*q));
00103 else LEMUR_THROW(LEMUR_RUNTIME_ERROR,"StructQueryRetMethod expects query of type TermQuery");
00104 }
00105
00106 #endif
00107
00108
00109
00110