private static Object serializeExpression(SerializerProvider serializerProvider, JsonSerializer<?> serializer, Expression<?> expression) {
if (expression instanceof Aggregation.FieldPath) {
return ((Aggregation.FieldPath) expression).toString();
}
if (expression instanceof Aggregation.Literal<?>) {
return new BasicDBObject("$literal", ((Aggregation.Literal<?>) expression).value());
}
if (expression instanceof Aggregation.ExpressionObject) {
BasicDBObject object = new BasicDBObject();
for (Entry<String, Expression<?>> property : ((Aggregation.ExpressionObject) expression).properties()) {
object.append(property.getKey(),
serializeExpression(serializerProvider, serializer, property.getValue()));
}
return object;
}
if (expression instanceof Aggregation.OperatorExpression) {
Aggregation.OperatorExpression<?> oe = (Aggregation.OperatorExpression<?>) expression;
BasicDBList operands = new BasicDBList();
for (Expression<?> e : oe.operands()) {
operands.add(serializeExpression(serializerProvider, serializer, e));
}
return new BasicDBObject(oe.operator(), operands);
}
throw new IllegalArgumentException(expression.getClass().getName());
}
}