View Javadoc
1   /*
2    * #%L
3    * UpdateOperation.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.write;
22  
23  import com.allanbank.mongodb.bson.Document;
24  import com.allanbank.mongodb.bson.DocumentAssignable;
25  
26  /**
27   * UpdateOperation provides a container for the fields in an update request.
28   * 
29   * @api.yes This class is part of the driver's API. Public and protected members
30   *          will be deprecated for at least 1 non-bugfix release (version
31   *          numbers are <major>.<minor>.<bugfix>) before being
32   *          removed or modified.
33   * @copyright 2014, Allanbank Consulting, Inc., All Rights Reserved
34   */
35  public class UpdateOperation implements WriteOperation {
36  
37      /** Serialization version for the class. */
38      private static final long serialVersionUID = 4657279430768594366L;
39  
40      /** If true then the update can modify multiple documents. */
41      private final boolean myMultiUpdate;
42  
43      /** The query to find the documents to update. */
44      private final Document myQuery;
45  
46      /** The update specification. */
47      private final Document myUpdate;
48  
49      /** If true then the document should be inserted if not found. */
50      private final boolean myUpsert;
51  
52      /**
53       * Creates a new UpdateOperation.
54       * 
55       * @param query
56       *            The query to find the documents to update.
57       * @param update
58       *            The update specification.
59       * @param multiUpdate
60       *            If true then the update is applied to all of the matching
61       *            documents, otherwise only the first document found is updated.
62       * @param upsert
63       *            If true then if no document is found then a new document is
64       *            created and updated, otherwise no operation is performed.
65       */
66      public UpdateOperation(final DocumentAssignable query,
67              final DocumentAssignable update, final boolean multiUpdate,
68              final boolean upsert) {
69          myQuery = query.asDocument();
70          myUpdate = update.asDocument();
71          myUpsert = upsert;
72          myMultiUpdate = multiUpdate;
73      }
74  
75      /**
76       * Determines if the passed object is of this same type as this object and
77       * if so that its fields are equal.
78       * 
79       * @param object
80       *            The object to compare to.
81       * 
82       * @see Object#equals(Object)
83       */
84      @Override
85      public boolean equals(final Object object) {
86          boolean result = false;
87          if (this == object) {
88              result = true;
89          }
90          else if ((object != null) && (getClass() == object.getClass())) {
91              final UpdateOperation other = (UpdateOperation) object;
92  
93              result = (myUpsert == other.myUpsert)
94                      && (myMultiUpdate == other.myMultiUpdate)
95                      && myQuery.equals(other.myQuery)
96                      && myUpdate.equals(other.myUpdate);
97          }
98          return result;
99      }
100 
101     /**
102      * Returns the query to find the documents to update.
103      * 
104      * @return The query to find the documents to update.
105      */
106     public Document getQuery() {
107         return myQuery;
108     }
109 
110     /**
111      * {@inheritDoc}
112      * <p>
113      * Overridden to return the query for the update.
114      * </p>
115      */
116     @Override
117     public Document getRoutingDocument() {
118         return myQuery;
119     }
120 
121     /**
122      * {@inheritDoc}
123      * <p>
124      * Overridden to return {@link WriteOperationType#UPDATE}.
125      * </p>
126      */
127     @Override
128     public final WriteOperationType getType() {
129         return WriteOperationType.UPDATE;
130     }
131 
132     /**
133      * Returns the update specification.
134      * 
135      * @return The update specification.
136      */
137     public Document getUpdate() {
138         return myUpdate;
139     }
140 
141     /**
142      * Computes a reasonable hash code.
143      * 
144      * @return The hash code value.
145      */
146     @Override
147     public int hashCode() {
148         int result = 1;
149         result = (31 * result) + (myUpsert ? 31 : 11);
150         result = (31 * result) + (myMultiUpdate ? 31 : 11);
151         result = (31 * result) + myQuery.hashCode();
152         result = (31 * result) + myUpdate.hashCode();
153         return result;
154     }
155 
156     /**
157      * Returns true if the update can modify multiple documents.
158      * 
159      * @return True if the update can modify multiple documents.
160      */
161     public boolean isMultiUpdate() {
162         return myMultiUpdate;
163     }
164 
165     /**
166      * Returns true if the document should be inserted if not found.
167      * 
168      * @return True if the document should be inserted if not found.
169      */
170     public boolean isUpsert() {
171         return myUpsert;
172     }
173 
174     /**
175      * {@inheritDoc}
176      * <p>
177      * Overridden to returns a representation of the update.
178      * </p>
179      */
180     @Override
181     public String toString() {
182         return "Update[upsert=" + myUpsert + ",multi=" + myMultiUpdate
183                 + ",query=" + myQuery + ",update=" + myUpdate + "]";
184     }
185 }