package org.objectstyle.cayenne.dba.derby;

import org.objectstyle.cayenne.access.trans.*;

import org.objectstyle.cayenne.access.trans.QueryAssembler;
import org.objectstyle.cayenne.exp.Expression;
import org.objectstyle.cayenne.map.DbAttribute;
import org.objectstyle.cayenne.access.trans.TrimmingQualifierTranslator;


public class DerbyQualifierTranslator
    extends TrimmingQualifierTranslator {
  public DerbyQualifierTranslator() {
    super();
  }

  public DerbyQualifierTranslator(QueryAssembler queryAssembler) {
    super(queryAssembler,"RTRIM");
  }



  public void finishedChild(Expression node, int childIndex,
                            boolean hasMoreChildren) {
    if (!hasMoreChildren) {
      return;
    }
    switch (node.getType()) {

      // originaly was with <like upper> .. now UPPER is append with
      //finishedChildNodeAppendExpression ... value.toUpperCase()
      case Expression.LIKE_IGNORE_CASE:
        finishedChildNodeAppendExpression(node, ") LIKE (");
        break;
      case Expression.NOT_LIKE_IGNORE_CASE:
        finishedChildNodeAppendExpression(node, ") NOT LIKE (");
        break;
      default:
        super.finishedChild(node, childIndex, hasMoreChildren);
    }
  }

  private void finishedChildNodeAppendExpression(Expression node,
                                                 String operation) {
    StringBuffer buf = (matchingObject) ? new StringBuffer() : qualBuf;
    buf.append(operation);
    if (node.getOperand(1) instanceof String)
      node.setOperand(1, ( (String) node.getOperand(1)).toUpperCase());

    if (matchingObject) {
      objectMatchTranslator.setOperation(buf.toString());
      objectMatchTranslator.setExpression(node);
    }
  }
}


