in parquet-cli/src/main/java/org/apache/parquet/cli/util/Expressions.java [114:182]
private static PathExpr parse(String path) {
PathExpr expr = null;
PathExpr last = null;
boolean inDeref = false;
boolean afterDeref = false;
int valueStart = 0;
for (int i = 0; i < path.length(); i += 1) {
switch (path.charAt(i)) {
case '.':
Preconditions.checkState(valueStart != i || afterDeref, "Empty reference: ''");
if (!inDeref) {
if (valueStart != i) {
PathExpr current = PathExpr.field(path.substring(valueStart, i));
if (last != null) {
last.children.add(current);
} else {
expr = current;
}
last = current;
}
valueStart = i + 1;
afterDeref = false;
}
break;
case '[':
Preconditions.checkState(!inDeref, "Cannot nest [ within []");
Preconditions.checkState(valueStart != i || afterDeref, "Empty reference: ''");
if (valueStart != i) {
PathExpr current = PathExpr.field(path.substring(valueStart, i));
if (last != null) {
last.children.add(current);
} else {
expr = current;
}
last = current;
}
valueStart = i + 1;
inDeref = true;
afterDeref = false;
break;
case ']':
Preconditions.checkState(inDeref, "Cannot use ] without a starting [");
Preconditions.checkState(valueStart != i, "Empty reference: ''");
PathExpr current = PathExpr.deref(path.substring(valueStart, i));
if (last != null) {
last.children.add(current);
} else {
expr = current;
}
last = current;
valueStart = i + 1;
inDeref = false;
afterDeref = true;
break;
default:
Preconditions.checkState(!afterDeref, "Fields after [] must start with .");
}
}
Preconditions.checkState(!inDeref, "Fields after [ must end with ]");
if (valueStart < path.length()) {
PathExpr current = PathExpr.field(path.substring(valueStart, path.length()));
if (last != null) {
last.children.add(current);
} else {
expr = current;
}
}
return expr;
}