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

com.bigdata.btree.proc.RangeCountProcedure Maven / Gradle / Ivy

/*

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
package com.bigdata.btree.proc;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

import com.bigdata.btree.IIndex;
import com.bigdata.btree.IndexMetadata;
import com.bigdata.mdi.LocalPartitionMetadata;

/**
 * This procedure computes a range count on an index.
 */
public class RangeCountProcedure extends AbstractKeyRangeIndexProcedure
        implements IParallelizableIndexProcedure {

    private static final long serialVersionUID = 5856712176446915328L;

    private boolean exact;
    private boolean deleted;
    
    /**
     * De-serialization ctor.
     */
    public RangeCountProcedure() {
        
        super();
        
    }

    /**
     * Range count using the specified bounds.
     * 
     * @param exact
     *            iff an exact range count is required.
     * @param deleted
     *            iff deleted tuples must be included in the count.
     * @param fromKey
     *            The lower bound (inclusive) -or- null if there
     *            is no lower bound.
     * @param toKey
     *            The upper bound (exclusive) -or- null if there
     *            is no upper bound.
     * 
     * @throws IllegalArgumentException
     *             if exact is false and deleted
     *             is true (there is no approximate reporting for
     *             range counts of deleted and undeleted tuples).
     */
    public RangeCountProcedure(boolean exact, boolean deleted, byte[] fromKey,
            byte[] toKey) {

        super( fromKey, toKey );
        
        if (!exact && deleted)
            throw new IllegalArgumentException();
        
        this.exact = exact;
        
        this.deleted = deleted;
        
    }

    @Override
    public final boolean isReadOnly() {
        
        return true;
        
    }
    
    /**
     * Return true iff the result count must be exact.
     */
    public final boolean isExact() {
        
        return exact;
        
    }

    /**
     * Return true iff deleted tuples must be included in the
     * result.
     */
    public final boolean isDeleted() {
        
        return deleted;
        
    }

    /**
     * 

* Range count of entries in a key range for the index. *

*

* Note: When the index {@link IndexMetadata#getDeleteMarkers()} this method * reports the upper bound estimate of the #of key-value pairs in the key * range of the index. The estimate is an upper bound because duplicate or * deleted entries in that have not been eradicated through a suitable * compacting merge will be reported. An exact count may be obtained using a * range iterator by NOT requesting either the keys or the values. *

* * @return The upper bound estimate of the #of key-value pairs in the key * range of the named index. */ @Override public Long apply(final IIndex ndx) { /* * Constrain the (fromKey, toKey) so that they address only the current * index partition. This allows the same instance of the procedure to be * mapped across a range of index partitions while constraining the query * to lie within the index partition. * * Note: This uses a local variable to prevent side effects. */ final LocalPartitionMetadata pmd = ndx.getIndexMetadata() .getPartitionMetadata(); final byte[] fromKey = constrainFromKey(this.fromKey, pmd); final byte[] toKey = constrainToKey(this.toKey, pmd); final long rangeCount; if (exact) { if (deleted) { rangeCount = ndx.rangeCountExactWithDeleted(fromKey, toKey); } else { rangeCount = ndx.rangeCountExact(fromKey, toKey); } } else { rangeCount = ndx.rangeCount(fromKey, toKey); } return Long.valueOf(rangeCount); } @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); exact = in.readBoolean(); deleted = in.readBoolean(); } @Override public void writeExternal(final ObjectOutput out) throws IOException { super.writeExternal(out); out.writeBoolean(exact); out.writeBoolean(deleted); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy