package com.ldbc.driver.workloads.ldbc.snb.interactive;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.ldbc.driver.Operation;
import com.ldbc.driver.SerializingMarshallingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static java.lang.String.format;
public class LdbcQuery14 extends Operation<List<LdbcQuery14Result>>
{
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
public static final int TYPE = 14;
private final long person1Id;
private final long person2Id;
public LdbcQuery14( long person1Id, long person2Id )
{
this.person1Id = person1Id;
this.person2Id = person2Id;
}
public long person1Id()
{
return person1Id;
}
public long person2Id()
{
return person2Id;
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{ return true; }
if ( o == null || getClass() != o.getClass() )
{ return false; }
LdbcQuery14 that = (LdbcQuery14) o;
if ( person1Id != that.person1Id )
{ return false; }
if ( person2Id != that.person2Id )
{ return false; }
return true;
}
@Override
public int hashCode()
{
int result = (int) (person1Id ^ (person1Id >>> 32));
result = 31 * result + (int) (person2Id ^ (person2Id >>> 32));
return result;
}
@Override
public String toString()
{
return "LdbcQuery14{" +
"person1Id=" + person1Id +
", person2Id=" + person2Id +
'}';
}
@Override
public List<LdbcQuery14Result> marshalResult( String serializedResults ) throws SerializingMarshallingException
{
List<List<Object>> resultsAsList;
try
{
resultsAsList = OBJECT_MAPPER.readValue(
serializedResults,
new TypeReference<List<List<Object>>>()
{
}
);
}
catch ( IOException e )
{
throw new SerializingMarshallingException(
format( "Error while parsing serialized results\n%s", serializedResults ), e );
}
List<LdbcQuery14Result> results = new ArrayList<>();
for ( int i = 0; i < resultsAsList.size(); i++ )
{
List<Object> resultAsList = resultsAsList.get( i );
Iterable<Long> personsIdsInPath =
Iterables.transform( (List<Number>) resultAsList.get( 0 ), new Function<Number,Long>()
{
@Override
public Long apply( Number number )
{
return number.longValue();
}
} );
double pathWeight = ((Number) resultAsList.get( 1 )).doubleValue();
results.add(
new LdbcQuery14Result(
personsIdsInPath,
pathWeight
)
);
}
return results;
}
@Override
public String serializeResult( Object resultsObject ) throws SerializingMarshallingException
{
List<LdbcQuery14Result> results = (List<LdbcQuery14Result>) resultsObject;
List<List<Object>> resultsFields = new ArrayList<>();
for ( int i = 0; i < results.size(); i++ )
{
LdbcQuery14Result result = results.get( i );
List<Object> resultFields = new ArrayList<>();
resultFields.add( result.personsIdsInPath() );
resultFields.add( result.pathWeight() );
resultsFields.add( resultFields );
}
try
{
return OBJECT_MAPPER.writeValueAsString( resultsFields );
}
catch ( IOException e )
{
throw new SerializingMarshallingException(
format( "Error while trying to serialize result\n%s", results.toString() ), e );
}
}
@Override
public int type()
{
return TYPE;
}
}