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

com.indeed.mph.SerializedKeyValueIterator Maven / Gradle / Ivy

There is a newer version: 1.0.5
Show newest version
package com.indeed.mph;

import com.google.common.io.LittleEndianDataInputStream;
import com.indeed.util.core.Pair;
import org.apache.log4j.Logger;

import java.io.Closeable;
import java.io.DataInput;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * @author alexs
 */
public class SerializedKeyValueIterator implements Iterator>, Closeable {
    private static final Logger LOGGER = Logger.getLogger(SerializedKeyValueIterator.class);
    private final InputStream input;
    private final DataInput in;
    private final SmartSerializer keySerializer;
    private final SmartSerializer valueSerializer;
    private Pair nextResult;

    public SerializedKeyValueIterator(final InputStream input, final SmartSerializer keySerializer, final SmartSerializer valueSerializer) throws IOException {
        this.input = input;
        this.in = new LittleEndianDataInputStream(input);
        this.keySerializer = keySerializer;
        this.valueSerializer = valueSerializer;
    }

    @Override
    public void close() throws IOException {
        input.close();
    }

    @Override
    protected void finalize() throws Throwable {
        close();
    }

    @Override
    public boolean hasNext() {
        if (nextResult == null) {
            try {
                final K key = keySerializer.read(in);
                final V value = valueSerializer.read(in);
                if (key == null || value == null) {
                    close();
                } else {
                    nextResult = new Pair<>(key, value);
                }
            } catch (final IOException e) {
                if (!(e instanceof EOFException)) {
                    LOGGER.error("couldn't read serialized input", e);
                }
                return false;
            }
        }
        return nextResult != null;
    }

    @Override
    public Pair next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        final Pair result = nextResult;
        nextResult = null;
        return result;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy