private static void extractPrefixes( Expr expr, Set<String> prefixes ) {
if ( expr instanceof BinaryExpr ) {
extractPrefixes( ( (BinaryExpr) expr ).getLHS(), prefixes );
extractPrefixes( ( (BinaryExpr) expr ).getRHS(), prefixes );
} else if ( expr instanceof FilterExpr ) {
extractPrefixes( ( (FilterExpr) expr ).getExpr(), prefixes );
for ( Object pred : ( (FilterExpr) expr ).getPredicates() ) {
extractPrefixes( (Predicate) pred, prefixes );
}
} else if ( expr instanceof FunctionCallExpr ) {
extractPrefix( ( (FunctionCallExpr) expr ).getPrefix(), prefixes );
for ( Object param : ( (FunctionCallExpr) expr ).getParameters() ) {
extractPrefixes( (Expr) param, prefixes );
}
} else if ( expr instanceof LocationPath ) {
for ( Object step : ( (LocationPath) expr ).getSteps() ) {
extractPrefixes( (Step) step, prefixes );
}
} else if ( expr instanceof PathExpr ) {
extractPrefixes( ( (PathExpr) expr ).getFilterExpr(), prefixes );
extractPrefixes( ( (PathExpr) expr ).getLocationPath(), prefixes );
} else if ( expr instanceof UnaryExpr ) {
extractPrefixes( ( (UnaryExpr) expr ).getExpr(), prefixes );
} else if ( expr instanceof VariableReferenceExpr ) {
extractPrefix( ( (VariableReferenceExpr) expr ).getPrefix(), prefixes );
}
}