public class

RangeBuilder

extends Object
package com.netflix.astyanax.util;

import java.nio.ByteBuffer;
import java.util.Date;
import java.util.UUID;

import com.netflix.astyanax.Serializer;
import com.netflix.astyanax.model.ByteBufferRange;
import com.netflix.astyanax.serializers.BooleanSerializer;
import com.netflix.astyanax.serializers.ByteBufferSerializer;
import com.netflix.astyanax.serializers.BytesArraySerializer;
import com.netflix.astyanax.serializers.DateSerializer;
import com.netflix.astyanax.serializers.DoubleSerializer;
import com.netflix.astyanax.serializers.IntegerSerializer;
import com.netflix.astyanax.serializers.LongSerializer;
import com.netflix.astyanax.serializers.StringSerializer;
import com.netflix.astyanax.serializers.UUIDSerializer;

/**
 * Utility builder to construct a ByteBufferRange to be used in a slice query.
 * 
 * @author elandau
 * 
 */
public class RangeBuilder {
    private static ByteBuffer EMPTY_BUFFER = ByteBuffer.allocate(0);
    private static final int DEFAULT_MAX_SIZE = Integer.MAX_VALUE;

    private ByteBuffer start = EMPTY_BUFFER;
    private ByteBuffer end = EMPTY_BUFFER;
    private int limit = DEFAULT_MAX_SIZE;
    private boolean reversed = false;

    /**
     * @deprecated use setLimit instead
     */
    @Deprecated
    public RangeBuilder setMaxSize(int count) {
        return setLimit(count);
    }

    public RangeBuilder setLimit(int count) {
        this.limit = count;
        return this;
    }

    /**
     * @deprecated Use setReversed(boolean reversed)
     * @return
     */
    @Deprecated
    public RangeBuilder setReversed() {
        reversed = true;
        return this;
    }

    public RangeBuilder setReversed(boolean reversed) {
        this.reversed = reversed;
        return this;
    }

    public RangeBuilder setStart(String value) {
        start = StringSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(byte[] value) {
        start = BytesArraySerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(int value) {
        start = IntegerSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(long value) {
        start = LongSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(boolean value) {
        start = BooleanSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(ByteBuffer value) {
        start = ByteBufferSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(Date value) {
        start = DateSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(double value) {
        start = DoubleSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setStart(UUID value) {
        start = UUIDSerializer.get().toByteBuffer(value);
        return this;
    }

    public <T> RangeBuilder setStart(T value, Serializer<T> serializer) {
        start = serializer.toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(String value) {
        end = StringSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(byte[] value) {
        end = BytesArraySerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(int value) {
        end = IntegerSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(long value) {
        end = LongSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(boolean value) {
        end = BooleanSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(ByteBuffer value) {
        end = ByteBufferSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(Date value) {
        end = DateSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(double value) {
        end = DoubleSerializer.get().toByteBuffer(value);
        return this;
    }

    public RangeBuilder setEnd(UUID value) {
        end = UUIDSerializer.get().toByteBuffer(value);
        return this;
    }

    public <T> RangeBuilder setEnd(T value, Serializer<T> serializer) {
        end = serializer.toByteBuffer(value);
        return this;
    }

    public ByteBufferRange build() {
        return new ByteBufferRangeImpl(clone(start), clone(end), limit, reversed);
    }

    public static ByteBuffer clone(ByteBuffer original) {
        ByteBuffer clone = ByteBuffer.allocate(original.capacity());
        original.rewind();// copy from the beginning
        clone.put(original);
        original.rewind();
        clone.flip();
        return clone;
    }
}