ValueStoreRevision.java
/*******************************************************************************
* Copyright (c) 2021 Eclipse RDF4J contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*******************************************************************************/
package org.eclipse.rdf4j.sail.lmdb;
import java.io.Serializable;
import java.util.Objects;
import org.eclipse.rdf4j.sail.lmdb.model.LmdbValue;
/**
* A {@link ValueStore ValueStore} revision for {@link LmdbValue LmdbValue} objects. For a cached value ID of a
* LmdbValue to be valid, the revision object needs to be equal to the concerning ValueStore's revision object. The
* ValueStore's revision object is changed whenever values are removed from it or IDs are changed.
*/
public interface ValueStoreRevision {
abstract class Base implements ValueStoreRevision {
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ValueStoreRevision)) {
return false;
}
ValueStoreRevision other = (ValueStoreRevision) o;
return getRevisionId() == other.getRevisionId() && Objects.equals(getValueStore(), other.getValueStore());
}
@Override
public int hashCode() {
return Objects.hash(getValueStore(), getRevisionId());
}
}
class Default extends Base implements Serializable {
private static final long serialVersionUID = -2434063125560285009L;
private static volatile long revisionIdCounter = 0;
transient private final ValueStore valueStore;
private final long revisionId = ++revisionIdCounter;
public Default(ValueStore valueStore) {
this.valueStore = valueStore;
}
public long getRevisionId() {
return revisionId;
}
public ValueStore getValueStore() {
return valueStore;
}
public boolean resolveValue(long id, LmdbValue value) {
return valueStore.resolveValue(id, value);
}
}
class Lazy extends Base implements Serializable {
private static final long serialVersionUID = -2434063125560285009L;
private final ValueStoreRevision revision;
private final long revisionId;
private final ValueStore valueStore;
public Lazy(ValueStoreRevision revision) {
this.revision = revision;
this.revisionId = revision.getRevisionId();
this.valueStore = revision.getValueStore();
}
@Override
public long getRevisionId() {
return revisionId;
}
@Override
public ValueStore getValueStore() {
return valueStore;
}
@Override
public boolean resolveValue(long id, LmdbValue value) {
if (valueStore.resolveValue(id, value)) {
// set unwrapped version of revision
value.setInternalID(id, revision);
return true;
}
return false;
}
}
long getRevisionId();
ValueStore getValueStore();
boolean resolveValue(long id, LmdbValue value);
}