/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.rdbms.postgresql;
import org.openrdf.query.BindingSet;
import org.openrdf.query.algebra.QueryModel;
import org.openrdf.query.algebra.evaluation.QueryOptimizer;
import org.openrdf.sail.rdbms.algebra.SqlConcat;
import org.openrdf.sail.rdbms.algebra.SqlNull;
import org.openrdf.sail.rdbms.algebra.SqlRegex;
import org.openrdf.sail.rdbms.algebra.StringValue;
import org.openrdf.sail.rdbms.algebra.base.RdbmsQueryModelVisitorBase;
import org.openrdf.sail.rdbms.algebra.base.SqlExpr;
/**
* Moves the regular expression flags into the pattern string as per the
* PostgreSQL syntax.
*
* @author James Leigh
*/
public class PgSqlRegexFlagsInliner extends RdbmsQueryModelVisitorBase<RuntimeException> implements
QueryOptimizer
{
public void optimize(QueryModel query, BindingSet bindings) {
query.visit(this);
}
@Override
public void meet(SqlRegex node)
throws RuntimeException
{
super.meet(node);
SqlExpr flags = node.getFlagsArg();
if (!(flags instanceof SqlNull)) {
SqlExpr pattern = node.getPatternArg();
SqlExpr prefix = concat(str("(?"), flags, str(")"));
pattern.replaceWith(concat(prefix, pattern.clone()));
node.setFlagsArg(null);
}
}
private SqlExpr str(String string) {
return new StringValue(string);
}
private SqlExpr concat(SqlExpr... exprs) {
SqlExpr concat = null;
for (SqlExpr expr : exprs) {
if (concat == null) {
concat = expr;
}
else {
concat = new SqlConcat(concat, expr);
}
}
return concat;
}
}