1 /* 2 * #%L 3 * AggregationGroupId.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.DocumentAssignable; 24 import com.allanbank.mongodb.bson.Element; 25 import com.allanbank.mongodb.bson.builder.impl.AbstractBuilder; 26 import com.allanbank.mongodb.bson.builder.impl.DocumentBuilderImpl; 27 import com.allanbank.mongodb.bson.element.DocumentElement; 28 import com.allanbank.mongodb.bson.element.StringElement; 29 30 /** 31 * AggregationGroupId holds the information for the <tt>_id</tt> field in an 32 * aggregate command's 33 * {@link Aggregate.Builder#group(AggregationGroupId, AggregationGroupField...) 34 * $group} pipeline operator. 35 * 36 * @see <a href= 37 * "http://docs.mongodb.org/manual/reference/aggregation/#_S_group">MongoDB 38 * Aggregate Command $group Operator</a> 39 * @api.yes This class is part of the driver's API. Public and protected members 40 * will be deprecated for at least 1 non-bugfix release (version 41 * numbers are <major>.<minor>.<bugfix>) before being 42 * removed or modified. 43 * @copyright 2012-2013, Allanbank Consulting, Inc., All Rights Reserved 44 */ 45 public class AggregationGroupId { 46 47 /** 48 * Constructs a {@link AggregationGroupId} with a constant value. 49 * 50 * @param value 51 * The value of the _id. 52 * @return The AggregationGroupId with a constant value. 53 * @see <a href= 54 * "http://docs.mongodb.org/manual/reference/aggregation/#_S_group">MongoDB 55 * Aggregate Command $group Operator</a> 56 */ 57 public static AggregationGroupId constantId(final String value) { 58 return new AggregationGroupId(value); 59 } 60 61 /** 62 * Creates a builder to construct a complex _id value for the group. 63 * 64 * @return The builder for the aggregation $group's id. 65 * @see <a href= 66 * "http://docs.mongodb.org/manual/reference/aggregation/#_S_group">MongoDB 67 * Aggregate Command $group Operator</a> 68 */ 69 public static AggregationGroupId.Builder id() { 70 return new AggregationGroupId.Builder(); 71 } 72 73 /** 74 * Constructs a {@link AggregationGroupId} with a value from a single field 75 * in the source documents. 76 * 77 * @param fieldRef 78 * The field name in the source documents to use in constructing 79 * the _id of the group'd documents. If the <tt>fieldRef</tt> 80 * does not start with a '$' then one will be added. 81 * @return The AggregationGroupId with a single field value reference (which 82 * may resolve to a complex sub-document). 83 * @see <a href= 84 * "http://docs.mongodb.org/manual/reference/aggregation/#_S_group">MongoDB 85 * Aggregate Command $group Operator</a> 86 */ 87 public static AggregationGroupId id(final String fieldRef) { 88 if (!fieldRef.startsWith("$")) { 89 return new AggregationGroupId("$" + fieldRef); 90 } 91 92 return new AggregationGroupId(fieldRef); 93 } 94 95 /** The id element. */ 96 private final Element myIdElement; 97 98 /** 99 * Creates a new AggregationGroupId. 100 * 101 * @param builder 102 * The builder containing the details of the id. 103 */ 104 public AggregationGroupId(final DocumentAssignable builder) { 105 myIdElement = new DocumentElement("_id", builder.asDocument()); 106 } 107 108 /** 109 * Creates a new AggregationGroupId. 110 * 111 * @param value 112 * The value for the simple group id. 113 */ 114 public AggregationGroupId(final String value) { 115 myIdElement = new StringElement("_id", value); 116 } 117 118 /** 119 * Returns the element for the group operator's id. 120 * 121 * @return The element for the group operator's id. 122 */ 123 public Element toElement() { 124 return myIdElement; 125 } 126 127 /** 128 * Builder provides the ability to construct a complex 129 * {@link AggregationGroupId}. 130 * <p> 131 * This {@link Builder} also implements the 132 * {@link com.allanbank.mongodb.bson.builder.DocumentBuilder} interface to 133 * allow the construction of arbitrarily complex id documents. 134 * </p> 135 * 136 * @api.yes This class is part of the driver's API. Public and protected 137 * members will be deprecated for at least 1 non-bugfix release 138 * (version numbers are <major>.<minor>.<bugfix>) 139 * before being removed or modified. 140 * @copyright 2012-2013, Allanbank Consulting, Inc., All Rights Reserved 141 */ 142 public static class Builder extends DocumentBuilderImpl { 143 144 /** 145 * Creates a new Builder. 146 */ 147 public Builder() { 148 super((AbstractBuilder) null); 149 } 150 151 /** 152 * Adds a field reference to the id document. The output field name is 153 * the same as the input field. 154 * <p> 155 * This method is equivalent to {@link #addField(String, String) 156 * addField(<fieldRef>, <fieldRef>)} with appropriate 157 * handling for the '$' prefix. 158 * </p> 159 * 160 * @param fieldRef 161 * The dotted field path for the field to use. If the 162 * <tt>fieldRef</tt> does not start with a '$' then one will 163 * be added. 164 * @return This builder for chaining method calls. 165 */ 166 public Builder addField(final String fieldRef) { 167 if (!fieldRef.startsWith("$")) { 168 add(new StringElement(fieldRef, "$" + fieldRef)); 169 } 170 else { 171 add(new StringElement(fieldRef.substring(1), fieldRef)); 172 } 173 return this; 174 } 175 176 /** 177 * Adds a field reference to the id document. 178 * 179 * @param name 180 * The name of the field in the id document. 181 * @param fieldRef 182 * The dotted field path for the field to use. If the 183 * <tt>fieldRef</tt> does not start with a '$' then one will 184 * be added. 185 * @return This builder for chaining method calls. 186 */ 187 public Builder addField(final String name, final String fieldRef) { 188 if (!fieldRef.startsWith("$")) { 189 add(new StringElement(name, "$" + fieldRef)); 190 } 191 else { 192 add(new StringElement(name, fieldRef)); 193 } 194 return this; 195 } 196 197 /** 198 * Constructs a new {@link AggregationGroupId} object from the state of 199 * the builder. 200 * 201 * @return The new {@link AggregationGroupId} object. 202 */ 203 public AggregationGroupId buildId() { 204 return new AggregationGroupId(this); 205 } 206 } 207 }