expr.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 461 行

JAVA
461
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.db.sql;import com.caucho.db.table.Column;import com.caucho.db.table.Table;import com.caucho.log.Log;import com.caucho.sql.SQLExceptionWrapper;import com.caucho.util.L10N;import com.caucho.util.QDate;import java.io.InputStream;import java.sql.SQLException;import java.sql.Types;import java.util.ArrayList;import java.util.logging.Logger;abstract public class Expr {  protected static final L10N L = new L10N(Expr.class);  private static final Logger log = Log.open(Expr.class);  public static final int UNKNOWN = -1;  public static final int FALSE = 0;  public static final int TRUE = 1;  final static long COST_INVALID  = Long.MAX_VALUE / 1000;  final static long COST_NO_TABLE = Integer.MAX_VALUE;  final static long COST_SCAN     = 1000000L;  final static long COST_UNIQUE   = 10000L;  final static long COST_INDEX    = 100L;  final static long COST_CONSTANT = 0L;    private static QDate _gmtDate = new QDate();  protected Expr bind(Query query)    throws SQLException  {    return this;  }  /**   * Returns the expected result type of the expression.   */  public Class getType()  {    return Object.class;  }  /**   * Returns true if the expression returns a long.   */  public boolean isLong()  {    Class type = getType();    return (int.class.equals(type) || long.class.equals(type)	    || java.sql.Date.class.equals(type));  }  /**   * Returns true if the expression returns a double.   */  public boolean isDouble()  {    Class type = getType();        return isLong() || double.class.isAssignableFrom(type);  }  /**   * Returns true if the expression returns a boolean.   */  public boolean isBoolean()  {    return boolean.class.equals(getType());  }  /**   * Returns true if the expression returns a binary stream.   */  public boolean isBinaryStream()  {    Class type = getType();    return (InputStream.class.equals(type));  }  /**   * Returns any column name.   */  public String getName()  {    return "";  }  /**   * Returns the column type.   */  public int getSQLType()  {    return Types.VARCHAR;  }  /**   * Returns the table.   */  public Table getTable()  {    return null;  }  /**   * Splits the expr into and blocks.   */  public void splitAnd(ArrayList<Expr> andProduct)  {    andProduct.add(this);  }  /**   * Returns the cost based on the given FromList.   */  public long cost(ArrayList<FromItem> fromList)  {    return subCost(fromList);  }  /**   * Returns the cost based on the given FromList.   */  public long subCost(ArrayList<FromItem> fromList)  {    return COST_INVALID;  }  /**   * Returns an index expression if available.   */  public RowIterateExpr getIndexExpr(FromItem fromItem)  {    return null;  }  /**   * Returns the order.   */  public Order createOrder(int index)  {    if (int.class.equals(getType()))      return new IntOrder(index);    else if (isLong())      return new LongOrder(index);    else if (isDouble())      return new DoubleOrder(index);    else      return new StringOrder(index);  }    /**   * Returns true if result is null   *   * @param rows the current database tuple   *   * @return true if null   */  public boolean isNull(QueryContext context)    throws SQLException  {    return false;  }  /**   * Returns true if the expression selects the row.   *   * @param rows the current database tuple   *   * @return the boolean value   */  public boolean isSelect(QueryContext context)    throws SQLException  {    return evalBoolean(context) == TRUE;  }  /**   * Evaluates the expression as a boolean.   *   * @param rows the current database tuple   *   * @return the boolean value   */  public int evalBoolean(QueryContext context)    throws SQLException  {    throw new UnsupportedOperationException(getClass().getName());  }  /**   * Evaluates the expression as a string.   *   * @param rows the current database tuple   *   * @return the string value   */  public String evalString(QueryContext context)    throws SQLException  {    throw new UnsupportedOperationException(getClass().getName());  }  /**   * Evaluates the expression as a long.   *   * @param rows the current database tuple   *   * @return the long value   */  public long evalLong(QueryContext context)    throws SQLException  {    String strValue = evalString(context);    if (strValue == null)      return 0;    else      return Long.parseLong(strValue);  }  /**   * Evaluates the expression as a double.   *   * @param rows the current database tuple   *   * @return the double value   */  public double evalDouble(QueryContext context)    throws SQLException  {    String strValue = evalString(context);    if (strValue == null)      return 0;    else      return Double.parseDouble(strValue);  }  /**   * Evaluates the expression as a date.   *   * @param rows the current database tuple   *   * @return the double value   */  public long evalDate(QueryContext context)    throws SQLException  {    String dateString = evalString(context);    try {      synchronized (_gmtDate) {	return _gmtDate.parseDate(dateString);      }    } catch (Exception e) {      throw new SQLExceptionWrapper(e);    }  }  /**   * Evaluates the expression, writing to the result stream.   *   * @param result the output result   */  public void evalToResult(QueryContext context, SelectResult result)    throws SQLException  {    String s = evalString(context);    if (s == null) {      result.writeNull();      return;    }    result.writeString(s);  }  /**   * Evaluates the expression as a string.   *   * @param rows the current database tuple   *   * @return the string value   */  public InputStream evalStream(QueryContext context)    throws SQLException  {    throw new UnsupportedOperationException(getClass().getName());  }  /**   * Evaluates the expression to a buffer   *   * @param result the result buffer   *   * @return the length of the result   */  public int evalToBuffer(QueryContext context,			  byte []buffer,			  int offset)    throws SQLException  {    throw new UnsupportedOperationException(getClass().getName());  }  /**   * Evaluates the expression to a buffer   *   * @param result the result buffer   *   * @return the length of the result   */  protected int evalToBuffer(QueryContext context,			     byte []buffer,			     int off,			     int columnType)    throws SQLException  {    switch (columnType) {    case Column.INT:      {	int v = (int) evalLong(context);	buffer[0] = (byte) (v >> 24);	buffer[1] = (byte) (v >> 16);	buffer[2] = (byte) (v >> 8);	buffer[3] = (byte) (v);	return 4;      }          case Column.LONG:    case Column.DATE:      {	long v = evalLong(context);	buffer[0] = (byte) (v >> 56);	buffer[1] = (byte) (v >> 48);	buffer[2] = (byte) (v >> 40);	buffer[3] = (byte) (v >> 32);		buffer[4] = (byte) (v >> 24);	buffer[5] = (byte) (v >> 16);	buffer[6] = (byte) (v >> 8);	buffer[7] = (byte) (v);	return 8;      }    case Column.VARCHAR:      {	String v = evalString(context);	if (v == null)	  return -1;		int length = v.length();	int offset = 0;	buffer[offset++] = (byte) length;	for (int i = 0; i < length; i++) {	  int ch = v.charAt(i);	  buffer[offset++] = (byte) (ch >> 8);	  buffer[offset++] = (byte) (ch);	}		return offset;      }    case Column.VARBINARY:      {	String v = evalString(context);	if (v == null)	  return -1;		int length = v.length();	int offset = 1;	for (int i = 0; i < length; i++) {	  int ch = v.charAt(i);	  if (ch < 0x80)	    buffer[offset++] = (byte) (ch & 0xff);	  else if (ch < 0x800) {	    buffer[offset++] = (byte) (0xc0 + ((ch >> 6) & 0x1f));	    buffer[offset++] = (byte) (0x80 + (ch & 0x3f));	  }	  else {	    buffer[offset++] = (byte) (0xe0 + ((ch >> 12) & 0x0f));	    buffer[offset++] = (byte) (0x80 + ((ch >> 6) & 0x3f));	    buffer[offset++] = (byte) (0x80 + (ch & 0x3f));	  }	}	buffer[0] = (byte) (offset - 1);		return offset;      }          default:      throw new UnsupportedOperationException(getClass().getName() + " unknown column: " + columnType);    }  }  /**   * Initializes aggregate functions during the group phase.   *   * @param context the current database tuple   */  public void initGroup(QueryContext context)    throws SQLException  {  }  /**   * Evaluates aggregate functions during the group phase.   *   * @param context the current database tuple   */  public void evalGroup(QueryContext context)    throws SQLException  {  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?