
package org.eigenbase.sql;

import java.util.List;

import org.eigenbase.sql.parser.*;
import org.eigenbase.sql.type.*;
import org.eigenbase.util.*;

import com.google.common.base.Function;
import com.google.common.collect.Lists;

/**
 * A binary (or hexadecimal) string literal.
 *
 * <p>The {@link #value} field is a {@link BitString} and {@link #typeName} is
 * {@link SqlTypeName#BINARY}.
 */
public class SqlBinaryStringLiteral extends SqlAbstractStringLiteral {
  private static final Function<SqlLiteral, BitString> F =
      new Function<SqlLiteral, BitString>() {
        public BitString apply(SqlLiteral literal) {
          return ((SqlBinaryStringLiteral) literal).getBitString();
        }
      };

  //~ Constructors -----------------------------------------------------------

  protected SqlBinaryStringLiteral(
      BitString val,
      SqlParserPos pos) {
    super(val, SqlTypeName.BINARY, pos);
  }

  //~ Methods ----------------------------------------------------------------

  /**
   * @return the underlying BitString
   */
  public BitString getBitString() {
    return (BitString) value;
  }

  public SqlNode clone(SqlParserPos pos) {
    return new SqlBinaryStringLiteral((BitString) value, pos);
  }

  public void unparse(
      SqlWriter writer,
      int leftPrec,
      int rightPrec) {
    assert value instanceof BitString;
    writer.literal("X'" + ((BitString) value).toHexString() + "'");
  }

  protected SqlAbstractStringLiteral concat1(List<SqlLiteral> literals) {
    return new SqlBinaryStringLiteral(
        BitString.concat(Lists.transform(literals, F)),
        literals.get(0).getParserPosition());
  }
}

// End SqlBinaryStringLiteral.java
