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 ); } }