1 /////////////////////////////////////////////////////////////////////////////
2 // Copyright (c) 2009-2014 Alan Wright. All rights reserved.
3 // Distributable under the terms of either the Apache License (Version 2.0)
4 // or the GNU Lesser General Public License.
5 /////////////////////////////////////////////////////////////////////////////
6 
7 #include "TestInc.h"
8 #include "PayloadHelper.h"
9 #include "TestUtils.h"
10 #include "RAMDirectory.h"
11 #include "IndexWriter.h"
12 #include "Document.h"
13 #include "Field.h"
14 #include "IndexSearcher.h"
15 #include "PayloadAttribute.h"
16 #include "TokenFilter.h"
17 #include "Payload.h"
18 #include "LowerCaseTokenizer.h"
19 #include "Analyzer.h"
20 
21 namespace Lucene {
22 
23 const String PayloadHelper::NO_PAYLOAD_FIELD = L"noPayloadField";
24 const String PayloadHelper::MULTI_FIELD = L"multiField";
25 const String PayloadHelper::FIELD = L"field";
26 
27 DECLARE_SHARED_PTR(PayloadHelperAnalyzer)
28 
29 class PayloadHelperFilter : public TokenFilter {
30 public:
PayloadHelperFilter(const TokenStreamPtr & input,const String & fieldName)31     PayloadHelperFilter(const TokenStreamPtr& input, const String& fieldName) : TokenFilter(input) {
32         this->numSeen = 0;
33         this->fieldName = fieldName;
34         this->payloadAtt = addAttribute<PayloadAttribute>();
35     }
36 
~PayloadHelperFilter()37     virtual ~PayloadHelperFilter() {
38     }
39 
40     LUCENE_CLASS(PayloadHelperFilter);
41 
42 public:
43     String fieldName;
44     int32_t numSeen;
45     PayloadAttributePtr payloadAtt;
46 
47 public:
incrementToken()48     virtual bool incrementToken() {
49         if (input->incrementToken()) {
50             if (fieldName == PayloadHelper::FIELD) {
51                 payloadAtt->setPayload(newLucene<Payload>(PayloadHelper::payloadField()));
52             } else if (fieldName == PayloadHelper::MULTI_FIELD) {
53                 if (numSeen % 2 == 0) {
54                     payloadAtt->setPayload(newLucene<Payload>(PayloadHelper::payloadMultiField1()));
55                 } else {
56                     payloadAtt->setPayload(newLucene<Payload>(PayloadHelper::payloadMultiField2()));
57                 }
58                 ++numSeen;
59             }
60             return true;
61         }
62         return false;
63     }
64 };
65 
66 class PayloadHelperAnalyzer : public Analyzer {
67 public:
~PayloadHelperAnalyzer()68     virtual ~PayloadHelperAnalyzer() {
69     }
70 
71     LUCENE_CLASS(PayloadHelperAnalyzer);
72 
73 public:
tokenStream(const String & fieldName,const ReaderPtr & reader)74     virtual TokenStreamPtr tokenStream(const String& fieldName, const ReaderPtr& reader) {
75         TokenStreamPtr result = newLucene<LowerCaseTokenizer>(reader);
76         result = newLucene<PayloadHelperFilter>(result, fieldName);
77         return result;
78     }
79 };
80 
~PayloadHelper()81 PayloadHelper::~PayloadHelper() {
82 }
83 
payloadField()84 const ByteArray PayloadHelper::payloadField() {
85     static ByteArray _payloadField;
86     if (!_payloadField) {
87         _payloadField = ByteArray::newInstance(1);
88         _payloadField[0] = 1;
89     }
90     return _payloadField;
91 }
92 
payloadMultiField1()93 const ByteArray PayloadHelper::payloadMultiField1() {
94     static ByteArray _payloadMultiField1;
95     if (!_payloadMultiField1) {
96         _payloadMultiField1 = ByteArray::newInstance(1);
97         _payloadMultiField1[0] = 2;
98     }
99     return _payloadMultiField1;
100 }
101 
payloadMultiField2()102 const ByteArray PayloadHelper::payloadMultiField2() {
103     static ByteArray _payloadMultiField2;
104     if (!_payloadMultiField2) {
105         _payloadMultiField2 = ByteArray::newInstance(1);
106         _payloadMultiField2[0] = 4;
107     }
108     return _payloadMultiField2;
109 }
110 
setUp(const SimilarityPtr & similarity,int32_t numDocs)111 IndexSearcherPtr PayloadHelper::setUp(const SimilarityPtr& similarity, int32_t numDocs) {
112     RAMDirectoryPtr directory = newLucene<RAMDirectory>();
113     PayloadHelperAnalyzerPtr analyzer = newLucene<PayloadHelperAnalyzer>();
114     IndexWriterPtr writer = newLucene<IndexWriter>(directory, analyzer, true, IndexWriter::MaxFieldLengthUNLIMITED);
115     writer->setSimilarity(similarity);
116     for (int32_t i = 0; i < numDocs; ++i) {
117         DocumentPtr doc = newLucene<Document>();
118         doc->add(newLucene<Field>(FIELD, intToEnglish(i), Field::STORE_YES, Field::INDEX_ANALYZED));
119         doc->add(newLucene<Field>(MULTI_FIELD, intToEnglish(i) + L"  " + intToEnglish(i), Field::STORE_YES, Field::INDEX_ANALYZED));
120         doc->add(newLucene<Field>(NO_PAYLOAD_FIELD, intToEnglish(i), Field::STORE_YES, Field::INDEX_ANALYZED));
121         writer->addDocument(doc);
122     }
123     writer->close();
124 
125     IndexSearcherPtr searcher = newLucene<IndexSearcher>(directory, true);
126     searcher->setSimilarity(similarity);
127     return searcher;
128 }
129 
130 }
131