package com.chenyang.druid.sql.visitor.functions;

import com.chenyang.druid.sql.ast.SQLExpr;
import com.chenyang.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.chenyang.druid.sql.parser.ParserException;
import com.chenyang.druid.sql.visitor.SQLEvalVisitor;
import com.chenyang.druid.util.HexBin;

public class Hex implements Function {
   public static final Hex instance = new Hex();

   public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) {
      if (x.getArguments().size() != 1) {
         throw new ParserException("argument's != 1, " + x.getArguments().size());
      } else {
         SQLExpr param0 = (SQLExpr)x.getArguments().get(0);
         param0.accept(visitor);
         Object param0Value = param0.getAttributes().get("eval.value");
         if (param0Value == null) {
            return SQLEvalVisitor.EVAL_ERROR;
         } else if (param0Value instanceof String) {
            byte[] bytes = ((String)param0Value).getBytes();
            String result = HexBin.encode(bytes);
            return result;
         } else if (param0Value instanceof Number) {
            long value = ((Number)param0Value).longValue();
            String result = Long.toHexString(value).toUpperCase();
            return result;
         } else {
            return SQLEvalVisitor.EVAL_ERROR;
         }
      }
   }
}
