1 /*
2 * #%L
3 * TextResult.java - mongodb-async-driver - Allanbank Consulting, Inc.
4 * %%
5 * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc.
6 * %%
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * #L%
19 */
20
21 package com.allanbank.mongodb.builder;
22
23 import com.allanbank.mongodb.bson.Document;
24 import com.allanbank.mongodb.bson.DocumentAssignable;
25 import com.allanbank.mongodb.bson.NumericElement;
26 import com.allanbank.mongodb.bson.element.DocumentElement;
27
28 /**
29 * TextResult provides a wrapper for a single result of a {@link Text text}
30 * command.
31 * <p>
32 * The result of a {@code text} command is a document that looks like the
33 * following:<blockquote>
34 *
35 * <pre>
36 * <code>
37 * > db.collection.runCommand( { "text": "collection" , search: "coffee magic" } )
38 * {
39 * "queryDebugString" : "coffe|magic||||||",
40 * "language" : "english",
41 * "results" : [
42 * {
43 * "score" : 2.25,
44 * "obj" : {
45 * "_id" : ObjectId("51376ab8602c316554cfe248"),
46 * "content" : "Coffee is full of magical powers."
47 * }
48 * },
49 * {
50 * "score" : 0.625,
51 * "obj" : {
52 * "_id" : ObjectId("51376a80602c316554cfe246"),
53 * "content" : "Now is the time to drink all of the coffee."
54 * }
55 * }
56 * ],
57 * "stats" : {
58 * "nscanned" : 3,
59 * "nscannedObjects" : 0,
60 * "n" : 2,
61 * "nfound" : 2,
62 * "timeMicros" : 97
63 * },
64 * "ok" : 1
65 * }
66 * </code>
67 * </pre>
68 *
69 * </blockquote>
70 * </p>
71 * <p>
72 * This class wraps a single entry from the {@code results} array.
73 * </p>
74 *
75 * @api.no <b>This class is NOT part of the Public API.</b> This class may be
76 * mutated in incompatible ways between any two releases of the driver.
77 * This class <b>WILL</b>, eventually, be part of the driver's API.
78 * Until MongoDB Inc. finalizes the text query interface we are keeping
79 * this class out of the Public API so we can track any changes more
80 * closely.
81 * @see <a
82 * href="http://docs.mongodb.org/manual/release-notes/2.4/#text-queries">
83 * MongoDB Text Queries</a>
84 * @since MongoDB 2.4
85 * @deprecated Support for the {@code text} command was deprecated in the 2.6
86 * version of MongoDB. Use the {@link ConditionBuilder#text(String)
87 * $text} query operator instead. This class will not be removed
88 * until two releases after the MongoDB 2.6 release (e.g. 2.10 if
89 * the releases are 2.8 and 2.10).
90 * @copyright 2013-2014, Allanbank Consulting, Inc., All Rights Reserved
91 */
92 @Deprecated
93 public class TextResult {
94 /** The document. */
95 private final Document myDocument;
96
97 /** The score for the document. */
98 private final Document myRawDocument;
99
100 /** The score for the document. */
101 private final double myScore;
102
103 /**
104 * Creates a new Text.
105 *
106 * @param document
107 * The document containing the 'score' and 'obj' fields.
108 * @throws AssertionError
109 * On the search term not being set.
110 */
111 public TextResult(final DocumentAssignable document) {
112 myRawDocument = document.asDocument();
113
114 final NumericElement score = myRawDocument.get(NumericElement.class,
115 "score");
116 if (score != null) {
117 myScore = score.getDoubleValue();
118 }
119 else {
120 myScore = -1;
121 }
122
123 final DocumentElement obj = myRawDocument.get(DocumentElement.class,
124 "obj");
125 if (obj != null) {
126 myDocument = obj.getDocument();
127 }
128 else {
129 myDocument = null;
130 }
131 }
132
133 /**
134 * {@inheritDoc}
135 * <p>
136 * Overridden to compare equal to an equivalent text result.
137 * </p>
138 */
139 @Override
140 public boolean equals(final Object object) {
141 boolean result = false;
142 if (this == object) {
143 result = true;
144 }
145 else if ((object != null) && (getClass() == object.getClass())) {
146 final TextResult other = (TextResult) object;
147
148 result = myRawDocument.equals(other.myRawDocument);
149 }
150 return result;
151 }
152
153 /**
154 * Returns the document.
155 *
156 * @return The document.
157 */
158 public Document getDocument() {
159 return myDocument;
160 }
161
162 /**
163 * Returns the un-processed result document. It is expected to be a document
164 * containing two fields: 'score' and 'obj'.
165 *
166 * @return The un-processed result document.
167 */
168 public Document getRawDocument() {
169 return myRawDocument;
170 }
171
172 /**
173 * Returns the score for the document.
174 *
175 * @return The score for the document.
176 */
177 public double getScore() {
178 return myScore;
179 }
180
181 /**
182 * {@inheritDoc}
183 * <p>
184 * Overridden to return the hashCode of the raw document.
185 * </p>
186 */
187 @Override
188 public int hashCode() {
189 return myRawDocument.hashCode();
190 }
191 }