private boolean writeArithmeticFieldPathUpdate(FieldPathUpdate fieldPathUpdate, JsonGenerator generator) throws IOException { if (! (fieldPathUpdate instanceof AssignFieldPathUpdate)) return false; String expression = ((AssignFieldPathUpdate) fieldPathUpdate).getExpression(); if (expression == null) return false; Matcher matcher = SingleValueReader.matchArithmeticOperation(expression); if (matcher.find()) { String updateOperation = SingleValueReader.ARITHMETIC_SIGN_TO_UPDATE_OPERATION.get(matcher.group(1)); double value = Double.valueOf(matcher.group(2)); generator.writeNumberField(updateOperation, value); return true; } return false; }
private void write(FieldPath fieldPath, Collection<FieldPathUpdate> fieldPathUpdates, JsonGenerator generator) throws IOException { generator.writeObjectFieldStart(fieldPath.toString()); for (FieldPathUpdate update : fieldPathUpdates) { if (writeArithmeticFieldPathUpdate(update, generator)) continue; generator.writeFieldName(update.getUpdateType().name().toLowerCase()); if (update instanceof AssignFieldPathUpdate) { AssignFieldPathUpdate assignUp = (AssignFieldPathUpdate) update; if (assignUp.getExpression() != null) { throw new RuntimeException("Unable to parse expression: " + assignUp.getExpression()); } else { assignUp.getNewValue().serialize(null, this); } } else if (update instanceof AddFieldPathUpdate) { ((AddFieldPathUpdate) update).getNewValues().serialize(null, this); } else if (update instanceof RemoveFieldPathUpdate) { generator.writeNumber(0); } else { throw new RuntimeException("Unsupported fieldpath operation: " + update.getClass().getName()); } } generator.writeEndObject(); }
@Override public String toString() { return "Assign: " + super.toString() + " : " + (isArithmetic() ? getExpression() : getNewValue().toString()); }
public void write(AssignFieldPathUpdate update) { write((FieldPathUpdate)update); byte flags = 0; if (update.getRemoveIfZero()) { flags |= AssignFieldPathUpdate.REMOVE_IF_ZERO; } if (update.getCreateMissingPath()) { flags |= AssignFieldPathUpdate.CREATE_MISSING_PATH; } if (update.isArithmetic()) { flags |= AssignFieldPathUpdate.ARITHMETIC_EXPRESSION; putByte(null, flags); put(null, update.getExpression()); } else { putByte(null, flags); update.getFieldValue().serialize(this); } }