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