private static ComplexAliasMember buildComplexMember(Value value) {
if (value instanceof FieldValue) {
FieldValue fv = (FieldValue) value;
return new ComplexAliasField(fv.getTableName(), fv.getFieldName(), null, null);
} else if (value instanceof FunctionCall) {
FunctionCall fc = (FunctionCall) value;
String name = fc.getName().toLowerCase();
if (fc.getArgCount() == 1) {
Value firstValue = fc.iterator().next();
if (firstValue instanceof FieldValue) {
FieldValue fv = (FieldValue) firstValue;
return new ComplexAliasField(fv.getTableName(), fv.getFieldName(), null, name);
} else if (firstValue instanceof FunctionCall) {
FunctionCall fc2 = (FunctionCall) firstValue;
if (fc2.getName().equalsIgnoreCase("coalesce") && fc2.getArgCount() == 2) {
Iterator<Value> it = fc2.iterator();
Value f1 = it.next(), f2 = it.next();
if (f1 instanceof FieldValue) {
FieldValue fv = (FieldValue) f1;
if (f2 instanceof NumberValue<?>) {
return new ComplexAliasField(fv.getTableName(), fv.getFieldName(), ((NumberValue<?>) f2).getNumber().toString(), name);