1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.client;
21
22 import java.io.IOException;
23 import java.nio.ByteBuffer;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.NavigableMap;
28 import java.util.TreeMap;
29 import java.util.UUID;
30
31 import org.apache.hadoop.hbase.classification.InterfaceAudience;
32 import org.apache.hadoop.hbase.classification.InterfaceStability;
33 import org.apache.hadoop.hbase.Cell;
34 import org.apache.hadoop.hbase.CellUtil;
35 import org.apache.hadoop.hbase.HConstants;
36 import org.apache.hadoop.hbase.KeyValue;
37 import org.apache.hadoop.hbase.Tag;
38 import org.apache.hadoop.hbase.io.HeapSize;
39 import org.apache.hadoop.hbase.security.access.Permission;
40 import org.apache.hadoop.hbase.security.visibility.CellVisibility;
41 import org.apache.hadoop.hbase.util.Bytes;
42
43
44
45
46
47
48
49
50 @InterfaceAudience.Public
51 @InterfaceStability.Stable
52 public class Put extends Mutation implements HeapSize, Comparable<Row> {
53
54
55
56
57 public Put(byte [] row) {
58 this(row, HConstants.LATEST_TIMESTAMP);
59 }
60
61
62
63
64
65
66
67 public Put(byte[] row, long ts) {
68 this(row, 0, row.length, ts);
69 }
70
71
72
73
74
75
76
77 public Put(byte [] rowArray, int rowOffset, int rowLength) {
78 this(rowArray, rowOffset, rowLength, HConstants.LATEST_TIMESTAMP);
79 }
80
81
82
83
84
85 public Put(ByteBuffer row, long ts) {
86 if (ts < 0) {
87 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
88 }
89 checkRow(row);
90 this.row = new byte[row.remaining()];
91 row.get(this.row);
92 this.ts = ts;
93 }
94
95
96
97
98 public Put(ByteBuffer row) {
99 this(row, HConstants.LATEST_TIMESTAMP);
100 }
101
102
103
104
105
106
107
108
109 public Put(byte [] rowArray, int rowOffset, int rowLength, long ts) {
110 checkRow(rowArray, rowOffset, rowLength);
111 this.row = Bytes.copy(rowArray, rowOffset, rowLength);
112 this.ts = ts;
113 if (ts < 0) {
114 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
115 }
116 }
117
118
119
120
121
122 public Put(Put putToCopy) {
123 this(putToCopy.getRow(), putToCopy.ts);
124 this.familyMap = new TreeMap<byte [], List<Cell>>(Bytes.BYTES_COMPARATOR);
125 for(Map.Entry<byte [], List<Cell>> entry: putToCopy.getFamilyCellMap().entrySet()) {
126 this.familyMap.put(entry.getKey(), new ArrayList<Cell>(entry.getValue()));
127 }
128 this.durability = putToCopy.durability;
129 for (Map.Entry<String, byte[]> entry : putToCopy.getAttributesMap().entrySet()) {
130 this.setAttribute(entry.getKey(), entry.getValue());
131 }
132 }
133
134
135
136
137
138
139
140
141
142 @Deprecated
143 public Put add(byte [] family, byte [] qualifier, byte [] value) {
144 return addColumn(family, qualifier, value);
145 }
146
147
148
149
150
151
152
153
154 public Put addColumn(byte [] family, byte [] qualifier, byte [] value) {
155 return addColumn(family, qualifier, this.ts, value);
156 }
157
158
159
160
161
162
163 public Put addImmutable(byte [] family, byte [] qualifier, byte [] value) {
164 return addImmutable(family, qualifier, this.ts, value);
165 }
166
167
168
169
170
171
172
173 @InterfaceAudience.Private
174 public Put addImmutable(byte[] family, byte [] qualifier, byte [] value, Tag[] tag) {
175 return addImmutable(family, qualifier, this.ts, value, tag);
176 }
177
178
179
180
181
182
183
184
185
186
187
188 @Deprecated
189 public Put add(byte [] family, byte [] qualifier, long ts, byte [] value) {
190 return addColumn(family, qualifier, ts, value);
191 }
192
193
194
195
196
197
198
199
200
201
202 public Put addColumn(byte [] family, byte [] qualifier, long ts, byte [] value) {
203 if (ts < 0) {
204 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
205 }
206 List<Cell> list = getCellList(family);
207 KeyValue kv = createPutKeyValue(family, qualifier, ts, value);
208 list.add(kv);
209 return this;
210 }
211
212
213
214
215
216
217 public Put addImmutable(byte [] family, byte [] qualifier, long ts, byte [] value) {
218 if (ts < 0) {
219 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
220 }
221 List<Cell> list = getCellList(family);
222 KeyValue kv = createPutKeyValue(family, qualifier, ts, value);
223 list.add(kv);
224 return this;
225 }
226
227
228
229
230
231
232
233 @InterfaceAudience.Private
234 public Put addImmutable(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tag) {
235 List<Cell> list = getCellList(family);
236 KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);
237 list.add(kv);
238 return this;
239 }
240
241
242
243
244
245
246
247 @InterfaceAudience.Private
248 public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,
249 Tag[] tag) {
250 if (ts < 0) {
251 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
252 }
253 List<Cell> list = getCellList(family);
254 KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);
255 list.add(kv);
256 return this;
257 }
258
259
260
261
262
263
264
265
266
267
268
269
270 @Deprecated
271 public Put add(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {
272 return addColumn(family, qualifier, ts, value);
273 }
274
275
276
277
278
279
280
281
282
283
284 public Put addColumn(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {
285 if (ts < 0) {
286 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
287 }
288 List<Cell> list = getCellList(family);
289 KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);
290 list.add(kv);
291 return this;
292 }
293
294
295
296
297
298
299 public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {
300 if (ts < 0) {
301 throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
302 }
303 List<Cell> list = getCellList(family);
304 KeyValue kv = createPutKeyValue(family, qualifier, ts, value, null);
305 list.add(kv);
306 return this;
307 }
308
309
310
311
312
313
314
315
316
317 public Put add(Cell kv) throws IOException{
318 byte [] family = CellUtil.cloneFamily(kv);
319 List<Cell> list = getCellList(family);
320
321 int res = Bytes.compareTo(this.row, 0, row.length,
322 kv.getRowArray(), kv.getRowOffset(), kv.getRowLength());
323 if (res != 0) {
324 throw new WrongRowIOException("The row in " + kv.toString() +
325 " doesn't match the original one " + Bytes.toStringBinary(this.row));
326 }
327 list.add(kv);
328 return this;
329 }
330
331
332
333
334
335
336
337
338
339
340
341 public boolean has(byte [] family, byte [] qualifier) {
342 return has(family, qualifier, this.ts, HConstants.EMPTY_BYTE_ARRAY, true, true);
343 }
344
345
346
347
348
349
350
351
352
353
354
355
356 public boolean has(byte [] family, byte [] qualifier, long ts) {
357 return has(family, qualifier, ts, HConstants.EMPTY_BYTE_ARRAY, false, true);
358 }
359
360
361
362
363
364
365
366
367
368
369
370
371 public boolean has(byte [] family, byte [] qualifier, byte [] value) {
372 return has(family, qualifier, this.ts, value, true, false);
373 }
374
375
376
377
378
379
380
381
382
383
384
385
386
387 public boolean has(byte [] family, byte [] qualifier, long ts, byte [] value) {
388 return has(family, qualifier, ts, value, false, false);
389 }
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405 private boolean has(byte[] family, byte[] qualifier, long ts, byte[] value,
406 boolean ignoreTS, boolean ignoreValue) {
407 List<Cell> list = getCellList(family);
408 if (list.size() == 0) {
409 return false;
410 }
411
412
413
414
415
416 if (!ignoreTS && !ignoreValue) {
417 for (Cell cell : list) {
418 if (CellUtil.matchingFamily(cell, family) &&
419 CellUtil.matchingQualifier(cell, qualifier) &&
420 CellUtil.matchingValue(cell, value) &&
421 cell.getTimestamp() == ts) {
422 return true;
423 }
424 }
425 } else if (ignoreValue && !ignoreTS) {
426 for (Cell cell : list) {
427 if (CellUtil.matchingFamily(cell, family) && CellUtil.matchingQualifier(cell, qualifier)
428 && cell.getTimestamp() == ts) {
429 return true;
430 }
431 }
432 } else if (!ignoreValue && ignoreTS) {
433 for (Cell cell : list) {
434 if (CellUtil.matchingFamily(cell, family) && CellUtil.matchingQualifier(cell, qualifier)
435 && CellUtil.matchingValue(cell, value)) {
436 return true;
437 }
438 }
439 } else {
440 for (Cell cell : list) {
441 if (CellUtil.matchingFamily(cell, family) &&
442 CellUtil.matchingQualifier(cell, qualifier)) {
443 return true;
444 }
445 }
446 }
447 return false;
448 }
449
450
451
452
453
454
455
456
457
458 public List<Cell> get(byte[] family, byte[] qualifier) {
459 List<Cell> filteredList = new ArrayList<Cell>();
460 for (Cell cell: getCellList(family)) {
461 if (CellUtil.matchingQualifier(cell, qualifier)) {
462 filteredList.add(cell);
463 }
464 }
465 return filteredList;
466 }
467
468 @Override
469 public Put setAttribute(String name, byte[] value) {
470 return (Put) super.setAttribute(name, value);
471 }
472
473 @Override
474 public Put setId(String id) {
475 return (Put) super.setId(id);
476 }
477
478 @Override
479 @Deprecated
480 public Put setWriteToWAL(boolean write) {
481 return (Put) super.setWriteToWAL(write);
482 }
483
484 @Override
485 public Put setDurability(Durability d) {
486 return (Put) super.setDurability(d);
487 }
488
489 @Override
490 public Put setFamilyCellMap(NavigableMap<byte[], List<Cell>> map) {
491 return (Put) super.setFamilyCellMap(map);
492 }
493
494 @Override
495 @Deprecated
496 public Put setFamilyMap(NavigableMap<byte[], List<KeyValue>> map) {
497 return (Put) super.setFamilyMap(map);
498 }
499
500 @Override
501 public Put setClusterIds(List<UUID> clusterIds) {
502 return (Put) super.setClusterIds(clusterIds);
503 }
504
505 @Override
506 public Put setCellVisibility(CellVisibility expression) {
507 return (Put) super.setCellVisibility(expression);
508 }
509
510 @Override
511 public Put setACL(String user, Permission perms) {
512 return (Put) super.setACL(user, perms);
513 }
514
515 @Override
516 public Put setACL(Map<String, Permission> perms) {
517 return (Put) super.setACL(perms);
518 }
519
520 @Override
521 public Put setTTL(long ttl) {
522 return (Put) super.setTTL(ttl);
523 }
524 }