1 23 24 package org.continuent.sequoia.controller.cache.result; 25 26 import java.util.ArrayList ; 27 import java.util.Collection ; 28 import java.util.Iterator ; 29 30 import org.continuent.sequoia.controller.backend.result.ControllerResultSet; 31 import org.continuent.sequoia.controller.cache.result.entries.AbstractResultCacheEntry; 32 import org.continuent.sequoia.controller.cache.result.schema.CacheDatabaseColumn; 33 import org.continuent.sequoia.controller.cache.result.schema.CacheDatabaseTable; 34 import org.continuent.sequoia.controller.requests.AbstractRequest; 35 import org.continuent.sequoia.controller.requests.DeleteRequest; 36 import org.continuent.sequoia.controller.requests.InsertRequest; 37 import org.continuent.sequoia.controller.requests.ParsingGranularities; 38 import org.continuent.sequoia.controller.requests.RequestType; 39 import org.continuent.sequoia.controller.requests.SelectRequest; 40 import org.continuent.sequoia.controller.requests.UpdateRequest; 41 import org.continuent.sequoia.controller.sql.schema.TableColumn; 42 43 56 public class ResultCacheColumnUnique extends ResultCache 57 { 58 59 65 public ResultCacheColumnUnique(int maxEntries, int pendingTimeout) 66 { 67 super(maxEntries, pendingTimeout); 68 parsingGranularity = ParsingGranularities.COLUMN_UNIQUE; 69 } 70 71 74 public void processAddToCache(AbstractResultCacheEntry qe) 75 { 76 SelectRequest request = qe.getRequest(); 77 ArrayList selectedColumns = request.getSelect(); 78 Collection from = request.getFrom(); 80 if (from == null) 81 return; 82 if (selectedColumns == null || selectedColumns.isEmpty()) 83 { 84 logger 85 .warn("No parsing of select clause found - Fallback to table granularity"); 86 for (Iterator i = from.iterator(); i.hasNext();) 87 { 88 CacheDatabaseTable table = cdbs.getTable((String ) i.next()); 89 table.addCacheEntry(qe); 90 ArrayList columns = table.getColumns(); 92 for (int j = 0; j < columns.size(); j++) 93 { 94 ((CacheDatabaseColumn) columns.get(j)).addCacheEntry(qe); 95 } 96 return; 97 } 98 } 99 for (Iterator i = request.getSelect().iterator(); i.hasNext();) 100 { 101 TableColumn tc = (TableColumn) i.next(); 102 cdbs.getTable(tc.getTableName()).getColumn(tc.getColumnName()) 103 .addCacheEntry(qe); 104 } 105 if (request.getWhere() != null) 106 { for (Iterator i = request.getWhere().iterator(); i.hasNext();) 108 { 109 TableColumn tc = (TableColumn) i.next(); 110 cdbs.getTable(tc.getTableName()).getColumn(tc.getColumnName()) 111 .addCacheEntry(qe); 112 } 113 if (request.getCacheAbility() == RequestType.UNIQUE_CACHEABLE) 114 { String tableName = (String ) from.iterator().next(); 116 AbstractResultCacheEntry entry = cdbs.getTable(tableName) 117 .getPkResultCacheEntry(request.getPkValue()); 118 if (entry != null) 119 { 120 if (entry.isValid()) 121 { if (entry.getRequest().getSelect().size() >= request.getSelect() 124 .size()) 125 return; 126 } 127 } 128 cdbs.getTable(tableName).addPkCacheEntry(request.getPkValue(), qe); 129 } 130 } 131 } 132 133 136 public boolean isUpdateNecessary(UpdateRequest request) 137 { 138 if (request.getCacheAbility() != RequestType.UNIQUE_CACHEABLE) 139 return true; 140 CacheDatabaseTable cacheTable = cdbs.getTable(request.getTableName()); 141 if (request.getColumns() == null) 142 return true; 143 String pk = request.getPk(); 144 AbstractResultCacheEntry qce = cacheTable.getPkResultCacheEntry(pk); 145 if (qce != null) 146 { 147 if (!qce.isValid()) 148 return true; 149 ControllerResultSet rs = qce.getResult(); 150 if (rs == null) 151 return true; 152 else 153 return needInvalidate(rs, request)[1]; 154 } 155 else 156 return true; 157 } 158 159 162 protected void processWriteNotify(AbstractRequest request) 163 { 164 for (Iterator iter = request.getSemantic().getWriteSet().iterator(); iter 165 .hasNext();) 166 { 167 String tableName = (String ) iter.next(); 168 CacheDatabaseTable cacheTable = cdbs.getTable(tableName); 169 if (request.isInsert()) 170 { 171 InsertRequest insert = (InsertRequest) request; 172 if (insert.getColumns() == null) 173 { 174 logger 175 .warn("No column parsing found - Fallback to table granularity (" 176 + request.getUniqueKey() + ")"); 177 cacheTable.invalidateAll(); 178 return; 179 } 180 for (Iterator i = insert.getColumns().iterator(); i.hasNext();) 181 { 182 TableColumn tc = (TableColumn) i.next(); 183 cdbs.getTable(tc.getTableName()).getColumn(tc.getColumnName()) 184 .invalidateAllNonUnique(); 185 } 186 } 187 else 188 { 189 if (request.getCacheAbility() == RequestType.UNIQUE_CACHEABLE) 190 { 191 if (request.isUpdate()) 192 { 193 String pk = ((UpdateRequest) request).getPk(); 194 AbstractResultCacheEntry qce = cacheTable.getPkResultCacheEntry(pk); 195 if (qce != null) 196 { 197 boolean[] invalidate = needInvalidate(qce.getResult(), 198 (UpdateRequest) request); 199 if (invalidate[0]) 200 { cacheTable.removePkResultCacheEntry(pk); 202 return; 203 } 204 else 205 { 206 if (logger.isDebugEnabled()) 207 logger.debug("No invalidate needed for request:" 208 + request.getSqlShortForm(20)); 209 return; } 211 } 212 } 213 else if (request.isDelete()) 214 { cacheTable.removePkResultCacheEntry(((DeleteRequest) request) 216 .getPk()); 217 return; 218 } 219 } 220 cacheTable.invalidateAll(); } 224 } 225 } 226 227 230 public String getName() 231 { 232 return "columnUnique"; 233 } 234 235 } | Popular Tags |