Package org.hibernate.ogm.datastore.map

Source Code of org.hibernate.ogm.datastore.map.MapDialect

/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.datastore.map;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.LockMode;
import org.hibernate.dialect.lock.LockingStrategy;
import org.hibernate.dialect.lock.OptimisticForceIncrementLockingStrategy;
import org.hibernate.dialect.lock.OptimisticLockingStrategy;
import org.hibernate.dialect.lock.PessimisticForceIncrementLockingStrategy;
import org.hibernate.ogm.datastore.map.impl.MapAssociationSnapshot;
import org.hibernate.ogm.datastore.map.impl.MapDatastoreProvider;
import org.hibernate.ogm.datastore.map.impl.MapHelpers;
import org.hibernate.ogm.datastore.map.impl.MapPessimisticReadLockingStrategy;
import org.hibernate.ogm.datastore.map.impl.MapPessimisticWriteLockingStrategy;
import org.hibernate.ogm.datastore.map.impl.MapTupleSnapshot;
import org.hibernate.ogm.datastore.spi.Association;
import org.hibernate.ogm.datastore.spi.AssociationContext;
import org.hibernate.ogm.datastore.spi.Tuple;
import org.hibernate.ogm.datastore.spi.TupleContext;
import org.hibernate.ogm.dialect.spi.BaseGridDialect;
import org.hibernate.ogm.grid.AssociationKey;
import org.hibernate.ogm.grid.EntityKey;
import org.hibernate.ogm.grid.EntityKeyMetadata;
import org.hibernate.ogm.grid.RowKey;
import org.hibernate.ogm.id.spi.NextValueRequest;
import org.hibernate.ogm.massindex.batchindexing.Consumer;
import org.hibernate.persister.entity.Lockable;

/**
* Grid dialect which uses a plain map for storing objects in memory. For testing purposes.
*
* @author Sanne Grinovero &lt;sanne@hibernate.org&gt; (C) 2011 Red Hat Inc.
*/
public class MapDialect extends BaseGridDialect {

  private final MapDatastoreProvider provider;

  public MapDialect(MapDatastoreProvider provider) {
    this.provider = provider;
  }

  @Override
  public LockingStrategy getLockingStrategy(Lockable lockable, LockMode lockMode) {
    if ( lockMode == LockMode.PESSIMISTIC_FORCE_INCREMENT ) {
      return new PessimisticForceIncrementLockingStrategy( lockable, lockMode );
    }
    else if ( lockMode == LockMode.PESSIMISTIC_WRITE ) {
      return new MapPessimisticWriteLockingStrategy( lockable, lockMode );
    }
    else if ( lockMode == LockMode.PESSIMISTIC_READ ) {
      return new MapPessimisticReadLockingStrategy( lockable, lockMode );
    }
    else if ( lockMode == LockMode.OPTIMISTIC ) {
      return new OptimisticLockingStrategy( lockable, lockMode );
    }
    else if ( lockMode == LockMode.OPTIMISTIC_FORCE_INCREMENT ) {
      return new OptimisticForceIncrementLockingStrategy( lockable, lockMode );
    }
    return new MapPessimisticWriteLockingStrategy( lockable, lockMode );
  }


  @Override
  public Tuple getTuple(EntityKey key, TupleContext tupleContext) {
    Map<String, Object> entityMap = provider.getEntityTuple( key );
    if ( entityMap == null ) {
      return null;
    }
    else {
      return new Tuple( new MapTupleSnapshot( entityMap ) );
    }
  }

  @Override
  public Tuple createTuple(EntityKey key, TupleContext tupleContext) {
    HashMap<String,Object> tuple = new HashMap<String,Object>();
    provider.putEntity( key, tuple );
    return new Tuple( new MapTupleSnapshot( tuple ) );
  }

  @Override
  public void updateTuple(Tuple tuple, EntityKey key, TupleContext tupleContext) {
    Map<String,Object> entityRecord = ( (MapTupleSnapshot) tuple.getSnapshot() ).getMap();
    MapHelpers.applyTupleOpsOnMap( tuple, entityRecord );
  }

  @Override
  public void removeTuple(EntityKey key, TupleContext tupleContext) {
    provider.removeEntityTuple( key );
  }

  @Override
  public Association getAssociation(AssociationKey key, AssociationContext associationContext) {
    Map<RowKey, Map<String, Object>> associationMap = provider.getAssociation( key );
    return associationMap == null ? null : new Association( new MapAssociationSnapshot( associationMap ) );
  }

  @Override
  public Association createAssociation(AssociationKey key, AssociationContext associationContext) {
    Map<RowKey, Map<String, Object>> associationMap = new HashMap<RowKey, Map<String,Object>>();
    provider.putAssociation( key, associationMap );
    return new Association( new MapAssociationSnapshot( associationMap ) );
  }

  @Override
  public void updateAssociation(Association association, AssociationKey key, AssociationContext associationContext) {
    MapHelpers.updateAssociation( association, key );
  }

  @Override
  public void removeAssociation(AssociationKey key, AssociationContext associationContext) {
    provider.removeAssociation( key );
  }

  @Override
  public Tuple createTupleAssociation(AssociationKey associationKey, RowKey rowKey) {
    return new Tuple();
  }

  @Override
  public boolean isStoredInEntityStructure(AssociationKey associationKey, AssociationContext associationContext) {
    return false;
  }

  @Override
  public Number nextValue(NextValueRequest request) {
    return provider.getSharedAtomicInteger( request.getKey(), request.getInitialValue(), request.getIncrement() );
  }

  @Override
  public boolean supportsSequences() {
    return false;
  }

  @Override
  public void forEachTuple(Consumer consumer, EntityKeyMetadata... metadatas) {
    Map<EntityKey, Map<String, Object>> entityMap = provider.getEntityMap();
    for ( EntityKey key : entityMap.keySet() ) {
      for ( EntityKeyMetadata metadata : metadatas ) {
        if ( key.getTable().equals( metadata.getTable() ) ) {
          consumer.consume( new Tuple( new MapTupleSnapshot( entityMap.get( key ) ) ) );
        }
      }
    }
  }
}
TOP

Related Classes of org.hibernate.ogm.datastore.map.MapDialect

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.