Package org.openrdf.sail.rdbms.postgresql

Source Code of org.openrdf.sail.rdbms.postgresql.PgSqlRegexFlagsInliner

/*
* 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;
  }
}
TOP

Related Classes of org.openrdf.sail.rdbms.postgresql.PgSqlRegexFlagsInliner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.