1 28 29 package com.caucho.db.sql; 30 31 import com.caucho.db.index.BTree; 32 import com.caucho.db.table.Column; 33 import com.caucho.db.table.TableIterator; 34 import com.caucho.log.Log; 35 import com.caucho.sql.SQLExceptionWrapper; 36 37 import java.io.IOException ; 38 import java.sql.SQLException ; 39 import java.util.logging.Logger ; 40 41 class IndexExpr extends RowIterateExpr { 42 private static final Logger log = Log.open(IndexExpr.class); 43 44 private IdExpr _columnExpr; 45 private Column _column; 46 private BTree _index; 47 48 private Expr _expr; 49 50 IndexExpr(IdExpr index, Expr expr) 51 { 52 _expr = expr; 53 _columnExpr = index; 54 55 if (expr == null || index == null) 56 throw new NullPointerException (); 57 58 _column = index.getColumn(); 59 _index = _column.getIndex(); 60 61 if (_index == null) 62 throw new IllegalArgumentException (); 63 } 64 65 68 protected Expr bind(Query query) 69 throws SQLException 70 { 71 _expr = _expr.bind(query); 72 73 return this; 74 } 75 76 79 boolean allowChildRowShift(QueryContext context, TableIterator rowIter) 80 { 81 return false; 82 } 83 84 87 boolean init(QueryContext context, TableIterator rowIter) 88 throws SQLException , IOException 89 { 90 rowIter.init(context); 91 92 96 return true; 97 } 98 99 102 boolean initRow(QueryContext context, TableIterator tableIter) 103 throws SQLException , IOException 104 { 105 long rowAddr = evalIndex(context); 106 107 if (rowAddr == 0) 108 return false; 109 110 context.unlock(); 111 112 tableIter.setRow(rowAddr); 113 114 context.lock(); 115 116 return true; 117 } 118 119 122 boolean nextRow(QueryContext context, TableIterator table) 123 { 124 return false; 125 } 126 127 long evalIndex(QueryContext context) 128 throws SQLException 129 { 130 byte []buffer = context.getBuffer(); 131 132 int length = _expr.evalToBuffer(context, buffer, _column.getTypeCode()); 133 134 if (length <= 0) 135 return 0; 136 137 try { 138 long index = _index.lookup(buffer, 0, length, context.getTransaction()); 139 140 return index; 141 } catch (IOException e) { 142 throw new SQLExceptionWrapper(e); 143 } 144 } 145 146 149 boolean nextBlock(QueryContext context, TableIterator rowIter) 150 throws IOException 151 { 152 return false; 153 } 154 155 public String toString() 156 { 157 return "(" + _columnExpr + " = " + _expr + ")"; 158 } 159 } 160 | Popular Tags |