Open Source Repository

Home /hibernate/hibernate-3.2.4.ga | Repository Home


org/hibernate/cache/QueryKey.java
//$Id: QueryKey.java 9636 2006-03-16 14:14:48Z [email protected] $
package org.hibernate.cache;

import java.io.Serializable;
import java.util.Map;
import java.util.Set;

import org.hibernate.EntityMode;
import org.hibernate.engine.QueryParameters;
import org.hibernate.engine.RowSelection;
import org.hibernate.transform.ResultTransformer;
import org.hibernate.type.Type;
import org.hibernate.util.EqualsHelper;

/**
 * A key that identifies a particular query with bound parameter values
 @author Gavin King
 */
public class QueryKey implements Serializable {
  private final String sqlQueryString;
  private final Type[] types;
  private final Object[] values;
  private final Integer firstRow;
  private final Integer maxRows;
  private final Map namedParameters;
  private final EntityMode entityMode;
  private final Set filters;
  private final int hashCode;
  
  // the user provided resulttransformer, not the one used with "select new". Here to avoid mangling transformed/non-transformed results.
  private final ResultTransformer customTransformer;
  
  public QueryKey(String queryString, QueryParameters queryParameters, Set filters, EntityMode entityMode) {
    this.sqlQueryString = queryString;
    this.types = queryParameters.getPositionalParameterTypes();
    this.values = queryParameters.getPositionalParameterValues();
    RowSelection selection = queryParameters.getRowSelection();
    if (selection!=null) {
      firstRow = selection.getFirstRow();
      maxRows = selection.getMaxRows();
    }
    else {
      firstRow = null;
      maxRows = null;
    }
    this.namedParameters = queryParameters.getNamedParameters();
    this.entityMode = entityMode;
    this.filters = filters;
    this.customTransformer = queryParameters.getResultTransformer();
    this.hashCode = getHashCode();
  }
  
  public boolean equals(Object other) {
    QueryKey that = (QueryKeyother;
    if !sqlQueryString.equals(that.sqlQueryString) ) return false;
    if !EqualsHelper.equals(firstRow, that.firstRow|| !EqualsHelper.equals(maxRows, that.maxRows) ) return false;
    if !EqualsHelper.equals(customTransformer, that.customTransformer) ) return false;
    if (types==null) {
      if (that.types!=nullreturn false;
    }
    else {
      if (that.types==nullreturn false;
      if types.length!=that.types.length return false;
      for int i=0; i<types.length; i++ ) {
        if types[i].getReturnedClass() != that.types[i].getReturnedClass() ) return false;
        if !types[i].isEqualvalues[i], that.values[i], entityMode ) ) return false;
      }
    }
    if !EqualsHelper.equals(filters, that.filters) ) return false;
    if !EqualsHelper.equals(namedParameters, that.namedParameters) ) return false;
    return true;
  }
  
  public int hashCode() {
    return hashCode;
  }
  
  private int getHashCode() {
    int result = 13;
    result = 37 * result + firstRow==null : firstRow.hashCode() );
    result = 37 * result + maxRows==null : maxRows.hashCode() );
    for int i=0; i<values.length; i++ ) {
      result = 37 * result + values[i]==null : types[i].getHashCodevalues[i], entityMode ) );
    }
    result = 37 * result + namedParameters==null : namedParameters.hashCode() );
    result = 37 * result + filters==null : filters.hashCode() );
    result = 37 * result + customTransformer==null : customTransformer.hashCode() );
    result = 37 * result + sqlQueryString.hashCode();
    return result;
  }

  public String toString() {
    StringBuffer buf = new StringBuffer()
      .append("sql: ")
      .append(sqlQueryString);
    if (values!=null) {
      buf.append("; parameters: ");
      for (int i=0; i<values.length; i++) {
        buf.appendvalues[i] )
          .append(", ");
      }
    }
    if (namedParameters!=null) {
      buf.append("; named parameters: ")
        .append(namedParameters);
    }
    if (filters!=null) {
      buf.append("; filters: ")
        .append(filters);
    }
    if (firstRow!=nullbuf.append("; first row: ").append(firstRow);
    if (maxRows!=nullbuf.append("; max rows: ").append(maxRows);
    if (customTransformer!=nullbuf.append("; transformer: ").append(customTransformer);
    return buf.toString();
  }
  
}