All Downloads are FREE. Search and download functionalities are using the official Maven repository.

studio.raptor.sqlparser.fast.value.ValueString Maven / Gradle / Ivy

/*
 * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
 * and the EPL 1.0 (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package studio.raptor.sqlparser.fast.value;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import studio.raptor.sqlparser.fast.engine.SysProperties;
import studio.raptor.sqlparser.fast.util.MathUtils;
import studio.raptor.sqlparser.fast.util.StringUtils;

/**
 * Implementation of the VARCHAR data type.
 * It is also the base class for other ValueString* classes.
 */
public class ValueString extends Value {

  private static final ValueString EMPTY = new ValueString("");

  /**
   * The string data.
   */
  protected final String value;

  protected ValueString(String value) {
    this.value = value;
  }

  /**
   * Get or create a string value for the given string.
   *
   * @param s the string
   * @return the value
   */
  public static Value get(String s) {
    return get(s, false);
  }

  /**
   * Get or create a string value for the given string.
   *
   * @param s the string
   * @param treatEmptyStringsAsNull whether or not to treat empty strings as NULL
   * @return the value
   */
  public static Value get(String s, boolean treatEmptyStringsAsNull) {
    if (s.isEmpty()) {
      return treatEmptyStringsAsNull ? ValueNull.INSTANCE : EMPTY;
    }
    ValueString obj = new ValueString(StringUtils.cache(s));
    if (s.length() > SysProperties.OBJECT_CACHE_MAX_PER_ELEMENT_SIZE) {
      return obj;
    }
    return cache(obj);
    // this saves memory, but is really slow
    // return new ValueString(s.intern());
  }

  @Override
  public String getSQL() {
    return StringUtils.quoteStringSQL(value);
  }

  @Override
  public boolean equals(Object other) {
    return other instanceof ValueString
        && value.equals(((ValueString) other).value);
  }

  @Override
  protected int compareSecure(Value o, CompareMode mode) {
    // compatibility: the other object could be another type
    ValueString v = (ValueString) o;
    return mode.compareString(value, v.value, false);
  }

  @Override
  public String getString() {
    return value;
  }

  @Override
  public long getPrecision() {
    return value.length();
  }

  @Override
  public Object getObject() {
    return value;
  }

  @Override
  public void set(PreparedStatement prep, int parameterIndex)
      throws SQLException {
    prep.setString(parameterIndex, value);
  }

  @Override
  public int getDisplaySize() {
    return value.length();
  }

  @Override
  public int getMemory() {
    return value.length() * 2 + 48;
  }

  @Override
  public Value convertPrecision(long precision, boolean force) {
    if (precision == 0 || value.length() <= precision) {
      return this;
    }
    int p = MathUtils.convertLongToInt(precision);
    return getNew(value.substring(0, p));
  }

  @Override
  public int hashCode() {
    // TODO hash performance: could build a quicker hash
    // by hashing the size and a few characters
    return value.hashCode();

    // proposed code:
//        private int hash = 0;
//
//        public int hashCode() {
//            int h = hash;
//            if (h == 0) {
//                String s = value;
//                int l = s.length();
//                if (l > 0) {
//                    if (l < 16)
//                        h = s.hashCode();
//                    else {
//                        h = l;
//                        for (int i = 1; i <= l; i <<= 1)
//                            h = 31 *
//                                (31 * h + s.charAt(i - 1)) +
//                                s.charAt(l - i);
//                    }
//                    hash = h;
//                }
//            }
//            return h;
//        }

  }

  @Override
  public int getType() {
    return STRING;
  }

  /**
   * Create a new String value of the current class.
   * This method is meant to be overridden by subclasses.
   *
   * @param s the string
   * @return the value
   */
  protected Value getNew(String s) {
    return ValueString.get(s);
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy