Package com.alvazan.orm.layer5.nosql.cache

Source Code of com.alvazan.orm.layer5.nosql.cache.NoSqlWriteCacheImpl

package com.alvazan.orm.layer5.nosql.cache;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import com.alvazan.orm.api.z5api.NoSqlSession;
import com.alvazan.orm.api.z8spi.Key;
import com.alvazan.orm.api.z8spi.KeyValue;
import com.alvazan.orm.api.z8spi.MetaLookup;
import com.alvazan.orm.api.z8spi.NoSqlRawSession;
import com.alvazan.orm.api.z8spi.Row;
import com.alvazan.orm.api.z8spi.ScanInfo;
import com.alvazan.orm.api.z8spi.action.Action;
import com.alvazan.orm.api.z8spi.action.Column;
import com.alvazan.orm.api.z8spi.action.IndexColumn;
import com.alvazan.orm.api.z8spi.action.Persist;
import com.alvazan.orm.api.z8spi.action.PersistIndex;
import com.alvazan.orm.api.z8spi.action.Remove;
import com.alvazan.orm.api.z8spi.action.RemoveColumn;
import com.alvazan.orm.api.z8spi.action.RemoveEnum;
import com.alvazan.orm.api.z8spi.action.RemoveIndex;
import com.alvazan.orm.api.z8spi.conv.StandardConverters;
import com.alvazan.orm.api.z8spi.iter.AbstractCursor;
import com.alvazan.orm.api.z8spi.iter.IterableWrappingCursor;
import com.alvazan.orm.api.z8spi.iter.AbstractCursor.Holder;
import com.alvazan.orm.api.z8spi.iter.DirectCursor;
import com.alvazan.orm.api.z8spi.meta.DboTableMeta;

public class NoSqlWriteCacheImpl implements NoSqlSession {

  @Inject
  @Named("logger")
  private NoSqlRawSession rawSession;
  private List<Action> actions = new ArrayList<Action>();
  private MetaLookup ormSession;
  private List<byte[]> newTables = new ArrayList<byte[]>();
 
  @Override
  public void put(DboTableMeta colFamily, byte[] rowKey, List<Column> columns) {
    if(DboTableMeta.class.getSimpleName().equals(colFamily))
      newTables.add(rowKey);

    Persist persist = new Persist();
    persist.setColFamily(colFamily);
    persist.setRowKey(rowKey);
    persist.setColumns(columns);
    actions.add(persist);
  }

  @Override
  public void remove(DboTableMeta colFamily, byte[] rowKey) {
    Remove remove = new Remove();
    remove.setAction(RemoveEnum.REMOVE_ENTIRE_ROW);
    remove.setColFamily(colFamily);
    remove.setRowKey(rowKey);
    actions.add(remove);     
  }
 
  @Override
  public void remove(DboTableMeta colFamily, byte[] rowKey, Collection<byte[]> columnNames) {
    Remove remove = new Remove();
    remove.setAction(RemoveEnum.REMOVE_COLUMNS_FROM_ROW);
    remove.setColFamily(colFamily);
    remove.setRowKey(rowKey);
    remove.setColumns(columnNames);
    actions.add(remove);   
  }

  @Override
  public void persistIndex(DboTableMeta cf, String indexColFamily, byte[] rowKey, IndexColumn column) {
    PersistIndex persist = new PersistIndex();
    persist.setColFamily(cf);
    persist.setIndexCfName(indexColFamily);
    persist.setRowKey(rowKey);
    persist.setColumn(column);
    actions.add(persist);
  }

  @Override
  public void removeColumn(DboTableMeta colFamily, byte[] rowKey, byte[] columnName) {
    RemoveColumn removeColumn = new RemoveColumn();
       removeColumn.setColFamily(colFamily);
       removeColumn.setRowKey(rowKey);
       removeColumn.setColumn(columnName);
    actions.add(removeColumn);
  }

  @Override
  public void removeFromIndex(DboTableMeta cf, String indexColFamily, byte[] rowKeyBytes,
      IndexColumn c) {
    RemoveIndex remove = new RemoveIndex();
    remove.setColFamily(cf);
    remove.setIndexCfName(indexColFamily);
    remove.setRowKey(rowKeyBytes);
    remove.setColumn(c);
    actions.add(remove);
  }

  @Override
  public AbstractCursor<KeyValue<Row>> find(DboTableMeta colFamily,
      DirectCursor<byte[]> rowKeys, boolean skipCache, boolean cacheResults, Integer batchSize) {
    int size = 500;
    if(batchSize != null)
      size = batchSize;
    return rawSession.find(colFamily, rowKeys, null, size, null, ormSession);
  }
 
  private List<Row> find(DboTableMeta colFamily, List<byte[]> keys, boolean cacheResults) {
    AbstractCursor<KeyValue<Row>> results = find(colFamily, new IterableWrappingCursor<byte[]>(keys), false, cacheResults, null);
    List<Row> rows = new ArrayList<Row>();
    while(true) {
      Holder<KeyValue<Row>> holder = results.nextImpl();
      if(holder == null)
        break;
      KeyValue<Row> kv = holder.getValue();
      rows.add(kv.getValue());
    }
    return rows;
  }
 
  public Row find(DboTableMeta colFamily, byte[] rowKey) {
    List<byte[]> rowKeys = new ArrayList<byte[]>();
    rowKeys.add(rowKey);
    //log.debug("cf="+colFamily+" finding the key="+new ByteArray(rowKey));
    List<Row> rows = find(colFamily, rowKeys, true);
    return rows.get(0);
  }

  @Override
  public void flush() {
    //if(log.isDebugEnabled())
    //  logInformation();
    rawSession.sendChanges(actions, ormSession);
    actions = new ArrayList<Action>();
   
    //special case here...if any persists were of the DboTableMeta, we should create table now
    for(byte[] key : newTables) {
      String colFamily = StandardConverters.convertFromBytes(String.class, key);
      rawSession.readMetaAndCreateTable(ormSession, colFamily);
    }
    newTables.clear();
  }

//  private void insertTime(Action action, long time) {
//    if(action instanceof Persist) {
//      ((Persist)action).setTimestamp(time);
//    }
//  }

  @Override
  public NoSqlRawSession getRawSession() {
    return rawSession;
  }

  @Override
  public void clearDb() {
    rawSession.clearDatabase();
  }
  @Override
  public AbstractCursor<Column> columnSlice(DboTableMeta colFamily, byte[] rowKey, byte[] from, byte[] to, Integer batchSize) {
    return rawSession.columnSlice(colFamily, rowKey, from, to, batchSize, null, ormSession);
  }
 
  @Override
  public AbstractCursor<IndexColumn> scanIndex(ScanInfo info, Key from, Key to, Integer batchSize) {
    return rawSession.scanIndex(info, from, to, batchSize, null, ormSession);
  }
  @Override
  public AbstractCursor<IndexColumn> scanIndex(ScanInfo scanInfo, List<byte[]> values) {
    return rawSession.scanIndex(scanInfo, values, null, ormSession);
  }
 
  @Override
  public void setOrmSessionForMeta(MetaLookup session) {
    this.ormSession = session;
  }

  @Override
  public void clear() {
  }
}
TOP

Related Classes of com.alvazan.orm.layer5.nosql.cache.NoSqlWriteCacheImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.