use of com.yahoo.processing.Response in project vespa by vespa-engine.
the class FutureDataTestCase method testFederateSyncAndAsyncData.
/**
* Federate to one source which returns data immediately and one who return future data
*/
@SuppressWarnings("unchecked")
@Test
public void testFederateSyncAndAsyncData() throws InterruptedException, ExecutionException, TimeoutException {
// Set up
FutureDataSource futureDataSource = new FutureDataSource();
Chain<Processor> chain = new Chain<>(new DataCounter(), new Federator(new Chain<>(new DataSource()), new Chain<>(futureDataSource)));
// Execute
Request request = new Request();
request.properties().set("appendage", 1);
Response response = Execution.createRoot(chain, 0, Execution.Environment.createEmpty()).process(request);
// Verify the result prior to completion of delayed data
// The sync data list + the (currently empty) future data list) + the data count
assertEquals(3, response.data().asList().size());
DataList syncData = (DataList) response.data().get(0);
DataList asyncData = (DataList) response.data().get(1);
StringData countData = (StringData) response.data().get(2);
assertEquals("The sync data is available", 3, syncData.asList().size());
assertEquals("first.1", syncData.get(0).toString());
assertEquals("second.1", syncData.get(1).toString());
assertEquals("third.1", syncData.get(2).toString());
assertEquals("No async data yet", 0, asyncData.asList().size());
assertEquals("The data counter has run and accessed the sync data", "Data count: 3", countData.toString());
// complete async data
futureDataSource.incomingData.get(0).add(new StringData(request, "d1"));
futureDataSource.incomingData.get(0).addLast(new StringData(request, "d2"));
assertEquals("New data is not visible because we haven't asked for it", 0, asyncData.asList().size());
asyncData.complete().get(1000, TimeUnit.MILLISECONDS);
assertEquals("Now the data is available", 2, asyncData.asList().size());
assertEquals("d1", asyncData.get(0).toString().toString());
assertEquals("d2", asyncData.get(1).toString().toString());
}
use of com.yahoo.processing.Response in project vespa by vespa-engine.
the class FutureDataTestCase method testAsyncDataProcessing.
/**
* Register a chain which will be called when some async data is available
*/
@SuppressWarnings("unchecked")
@Test
public void testAsyncDataProcessing() throws InterruptedException, ExecutionException, TimeoutException {
// Set up
FutureDataSource futureDataSource = new FutureDataSource();
Chain<Processor> asyncChain = new Chain<Processor>(new DataCounter());
Chain<Processor> chain = new Chain<>(new AsyncDataProcessingInitiator(asyncChain), futureDataSource);
// Execute
Request request = new Request();
Response response = Execution.createRoot(chain, 0, Execution.Environment.createEmpty()).process(request);
// Verify the result prior to completion of delayed data
assertEquals("No data yet", 0, response.data().asList().size());
// complete async data
futureDataSource.incomingData.get(0).add(new StringData(request, "d1"));
assertEquals("New data is not visible because it is not complete", 0, response.data().asList().size());
futureDataSource.incomingData.get(0).addLast(new StringData(request, "d2"));
assertEquals("Not visible because it has not been synced yet", 0, response.data().asList().size());
response.data().complete().get(1000, TimeUnit.MILLISECONDS);
assertEquals("Now the data as well as the count is available", 3, response.data().asList().size());
assertEquals("d1", response.data().get(0).toString().toString());
assertEquals("d2", response.data().get(1).toString().toString());
assertEquals("Data count: 2", response.data().get(2).toString());
}
use of com.yahoo.processing.Response in project vespa by vespa-engine.
the class FutureDataTestCase method testFutureDataPassThrough.
/**
* Run a chain which ends in a processor which returns a response containing future data.
*/
@SuppressWarnings("unchecked")
@Test
public void testFutureDataPassThrough() throws InterruptedException, ExecutionException, TimeoutException {
// Set up
FutureDataSource futureDataSource = new FutureDataSource();
Chain<Processor> chain = new Chain<>(new DataCounter(), futureDataSource);
// Execute
Request request = new Request();
// Urk ...
Response response = Execution.createRoot(chain, 0, Execution.Environment.createEmpty()).process(request);
// Verify the result prior to completion of delayed data
assertEquals(1, response.data().asList().size());
assertEquals("Data count: 0", response.data().get(0).toString());
// complete delayed data
assertEquals("Delayed data was requested once", 1, futureDataSource.incomingData.size());
futureDataSource.incomingData.get(0).add(new StringData(request, "d1"));
futureDataSource.incomingData.get(0).addLast(new StringData(request, "d2"));
assertEquals("New data is not visible because we haven't asked for it", 1, response.data().asList().size());
response.data().complete().get(1000, TimeUnit.MILLISECONDS);
assertEquals("Now the data is available", 3, response.data().asList().size());
assertEquals("d1", response.data().get(1).toString().toString());
assertEquals("d2", response.data().get(2).toString().toString());
}
use of com.yahoo.processing.Response in project vespa by vespa-engine.
the class AsyncDataProducer method process.
@SuppressWarnings("unchecked")
@Override
public Response process(Request request, Execution execution) {
// Default implementation
DataList dataList = ArrayDataList.createAsync(request);
incomingData = dataList.incoming();
return new Response(dataList);
}
use of com.yahoo.processing.Response in project vespa by vespa-engine.
the class Federator method process.
@SuppressWarnings("unchecked")
@Override
public Response process(Request request, Execution execution) {
List<FutureResponse> futureResponses = new ArrayList<>(chains.size());
for (Chain<? extends Processor> chain : chains) {
futureResponses.add(new AsyncExecution(chain, execution).process(request));
}
Response response = execution.process(request);
AsyncExecution.waitForAll(futureResponses, 1000);
for (FutureResponse futureResponse : futureResponses) {
Response federatedResponse = futureResponse.get();
response.data().add(federatedResponse.data());
response.mergeWith(federatedResponse);
}
return response;
}
Aggregations