Package org.openrdf.sail.rdbms.schema

Source Code of org.openrdf.sail.rdbms.schema.IntegerIdSequence

/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.rdbms.schema;

import java.sql.SQLException;
import java.sql.Types;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;

import org.openrdf.model.Value;

/**
* @author James Leigh
*/
public class IntegerIdSequence extends IdSequence {

  private int SPAN = 268435455;

  private int SHIFT = Long.toBinaryString(SPAN).length();

  private Number[] minIds;

  private ConcurrentMap<ValueType, AtomicInteger> seq = new ConcurrentHashMap<ValueType, AtomicInteger>();

  @Override
  public int getShift() {
    return SHIFT;
  }

  @Override
  public int getJdbcIdType() {
    return Types.INTEGER;
  }

  @Override
  public String getSqlType() {
    return "INTEGER";
  }

  @Override
  public void init()
    throws SQLException
  {
    minIds = new Number[ValueType.values().length];
    for (int i = 0; i < minIds.length; i++) {
      minIds[i] = i * (SPAN + 1);
    }
    if (getHashTable() != null) {
      for (Number max : getHashTable().maxIds(getShift(), getMod())) {
        ValueType code = valueOf(max);
        if (max.intValue() > minId(code).intValue()) {
          if (!seq.containsKey(code) || seq.get(code).intValue() < max.intValue()) {
            seq.put(code, new AtomicInteger(max.intValue()));
          }
        }
      }
    }
  }

  @Override
  public Number idOf(Number number) {
    return number.intValue();
  }

  @Override
  public Number maxId(ValueType type) {
    return minId(type).intValue() + SPAN;
  }

  @Override
  public Number minId(ValueType type) {
    return minIds[type.index()];
  }

  @Override
  public Number nextId(Value value) {
    ValueType code = valueOf(value);
    if (!seq.containsKey(code)) {
      seq.putIfAbsent(code, new AtomicInteger(minId(code).intValue()));
    }
    int id = seq.get(code).incrementAndGet();
    return id;
  }

  @Override
  protected int shift(Number id) {
    return id.intValue() >>> SHIFT;
  }
}
TOP

Related Classes of org.openrdf.sail.rdbms.schema.IntegerIdSequence

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.