All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.sirix.page.delegates.FullReferencesPage Maven / Gradle / Ivy

Go to download

SirixDB is a hybrid on-disk and in-memory document oriented, versioned database system. It has a lightweight buffer manager, stores everything in a huge persistent and durable tree and allows efficient reconstruction of every revision. Furthermore, SirixDB implements change tracking, diffing and supports time travel queries.

There is a newer version: 0.11.0
Show newest version
/*
 * Copyright (c) 2011, University of Konstanz, Distributed Systems Group All rights reserved.
 * 

* Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * Redistributions of source code must retain the * above copyright notice, this list of conditions and the following disclaimer. * Redistributions * in binary form must reproduce the above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other materials provided with the distribution. * * Neither the name of the University of Konstanz nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written permission. *

* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package io.sirix.page.delegates; import com.google.common.base.MoreObjects; import io.sirix.api.PageTrx; import io.sirix.page.PageReference; import io.sirix.page.SerializationType; import io.sirix.page.interfaces.Page; import io.sirix.settings.Constants; import net.openhft.chronicle.bytes.BytesIn; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; import java.util.List; /** * Class to provide basic reference handling functionality. */ public final class FullReferencesPage implements Page { /** * Page references. */ private final PageReference[] references; /** * Constructor to read from durable storage. * * @param in input stream to read from * @param type the serialization type */ public FullReferencesPage(final BytesIn in, final SerializationType type) { references = type.deserializeFullReferencesPage(in); } /** * Constructor to copy data from a {@link BitmapReferencesPage}. * * @param pageToClone committed page */ public FullReferencesPage(final BitmapReferencesPage pageToClone) { references = new PageReference[Constants.INP_REFERENCE_COUNT]; final BitSet bitSet = pageToClone.getBitmap(); for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet.nextSetBit(i + 1)) { final var pageReferenceToClone = pageToClone.getReferences().get(i); final var newPageReference = new PageReference(pageReferenceToClone); references[i] = newPageReference; } } /** * Copy constructor. * * @param pageToClone committed page */ public FullReferencesPage(final FullReferencesPage pageToClone) { references = new PageReference[Constants.INP_REFERENCE_COUNT]; for (int index = 0, size = pageToClone.references.length; index < size; index++) { final var pageReference = new PageReference(); final var pageReferenceToClone = pageToClone.getReferences().get(index); if (pageReferenceToClone != null) { pageReference.setKey(pageReferenceToClone.getKey()); pageReference.setLogKey(pageReferenceToClone.getLogKey()); pageReference.setPageFragments(new ArrayList<>(pageReferenceToClone.getPageFragments())); } references[index] = pageReference; } } @Override public List getReferences() { return Arrays.asList(references); } public PageReference[] getReferencesArray(){ return this.references; } /** * Get page reference of given offset. * * @param offset offset of page reference * @return {@link PageReference} at given offset */ @Override public PageReference getOrCreateReference(final @NonNegative int offset) { final var pageReference = references[offset]; if (pageReference != null) { return pageReference; } final var newPageReference = new PageReference(); references[offset] = newPageReference; return newPageReference; } @Override public boolean setOrCreateReference(final int offset, final PageReference pageReference) { references[offset] = pageReference; return false; } /** * Recursively call commit on all referenced pages. * * @param pageWriteTrx the page write transaction */ @Override public void commit(@NonNull final PageTrx pageWriteTrx) { for (final PageReference reference : references) { if (reference != null && (reference.getLogKey() != Constants.NULL_ID_INT)) { pageWriteTrx.commit(reference); } } } @Override public String toString() { final MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(this); for (final PageReference ref : references) { helper.add("reference", ref); } return helper.toString(); } @Override public Page clearPage() { Arrays.fill(references, null); return Page.super.clearPage(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy