package com.ldbc.driver.workloads.ldbc.snb.bi;
import com.google.common.base.Charsets;
import com.ldbc.driver.Operation;
import com.ldbc.driver.WorkloadException;
import com.ldbc.driver.csv.charseeker.BufferedCharSeeker;
import com.ldbc.driver.csv.charseeker.CharSeeker;
import com.ldbc.driver.csv.charseeker.CharSeekerParams;
import com.ldbc.driver.csv.charseeker.Extractors;
import com.ldbc.driver.csv.charseeker.Mark;
import com.ldbc.driver.csv.charseeker.Readables;
import com.ldbc.driver.generator.CsvEventStreamReaderBasicCharSeeker;
import com.ldbc.driver.generator.GeneratorFactory;
import com.ldbc.driver.generator.NoRemoveIterator;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import static java.lang.String.format;
abstract class BaseEventStreamReader extends NoRemoveIterator<Operation> implements Closeable
{
private final CharSeeker charSeeker;
private final InputStream parametersInputStream;
private final Iterator<Object[]> parametersIterator;
public BaseEventStreamReader(
InputStream parametersInputStream,
CharSeekerParams charSeekerParams,
GeneratorFactory gf ) throws WorkloadException
{
this.parametersInputStream = parametersInputStream;
charSeeker = new BufferedCharSeeker(
Readables.wrap(
new InputStreamReader( parametersInputStream, Charsets.UTF_8 )
),
charSeekerParams.bufferSize()
);
Mark mark = new Mark();
// skip headers
try
{
for ( int i = 0; i < columnCount(); i++ )
{
charSeeker.seek( mark, new int[]{charSeekerParams.columnDelimiter()} );
}
}
catch ( IOException e )
{
throw new WorkloadException(
format( "Unable to advance parameters stream beyond headers: %s", parametersInputStream ), e );
}
parametersIterator = gf.repeating(
new CsvEventStreamReaderBasicCharSeeker<>(
charSeeker,
new Extractors( charSeekerParams.arrayDelimiter(), charSeekerParams.tupleDelimiter() ),
mark,
decoder(),
charSeekerParams.columnDelimiter()
)
);
}
@Override
public boolean hasNext()
{
return parametersIterator.hasNext();
}
@Override
public Operation next()
{
Object[] parameters = parametersIterator.next();
Operation operation = operationFromParameters( parameters );
operation.setDependencyTimeStamp( 0 );
return operation;
}
@Override
public void close() throws IOException
{
charSeeker.close();
parametersInputStream.close();
}
abstract Operation operationFromParameters( Object[] parameters );
abstract CsvEventStreamReaderBasicCharSeeker.EventDecoder<Object[]> decoder();
abstract int columnCount();
}