use of com.yahoo.elide.core.datastore.DataStoreIterableBuilder in project elide by yahoo.
the class InMemoryStoreTransactionTest method testFilteringRequiresInMemorySorting.
@Test
public void testFilteringRequiresInMemorySorting() {
FilterExpression expression = new InPredicate(new Path(Book.class, dictionary, "genre"), "Literary Fiction");
Map<String, Sorting.SortOrder> sortOrder = new HashMap<>();
sortOrder.put("title", Sorting.SortOrder.desc);
Sorting sorting = new SortingImpl(sortOrder, Book.class, dictionary);
EntityProjection projection = EntityProjection.builder().type(Book.class).filterExpression(expression).sorting(sorting).build();
DataStoreIterable filterInMemory = new DataStoreIterableBuilder(books).filterInMemory(true).build();
when(wrappedTransaction.loadObjects(any(), eq(scope))).thenReturn(filterInMemory);
Collection<Object> loaded = Lists.newArrayList(inMemoryStoreTransaction.loadObjects(projection, scope));
verify(wrappedTransaction, times(1)).loadObjects(any(EntityProjection.class), eq(scope));
assertEquals(2, loaded.size());
List<String> bookTitles = loaded.stream().map((o) -> ((Book) o).getTitle()).collect(Collectors.toList());
assertEquals(Lists.newArrayList("Book 3", "Book 1"), bookTitles);
}
use of com.yahoo.elide.core.datastore.DataStoreIterableBuilder in project elide by yahoo.
the class InMemoryStoreTransactionTest method testDataStoreRequiresInMemorySorting.
@Test
public void testDataStoreRequiresInMemorySorting() {
Map<String, Sorting.SortOrder> sortOrder = new HashMap<>();
sortOrder.put("title", Sorting.SortOrder.desc);
Sorting sorting = new SortingImpl(sortOrder, Book.class, dictionary);
EntityProjection projection = EntityProjection.builder().type(Book.class).sorting(sorting).build();
DataStoreIterable sortInMemory = new DataStoreIterableBuilder(books).sortInMemory(true).build();
when(wrappedTransaction.loadObjects(any(), eq(scope))).thenReturn(sortInMemory);
Collection<Object> loaded = Lists.newArrayList(inMemoryStoreTransaction.loadObjects(projection, scope));
verify(wrappedTransaction, times(1)).loadObjects(any(EntityProjection.class), eq(scope));
assertEquals(3, loaded.size());
List<String> bookTitles = loaded.stream().map((o) -> ((Book) o).getTitle()).collect(Collectors.toList());
assertEquals(bookTitles, Lists.newArrayList("Book 3", "Book 2", "Book 1"));
}
use of com.yahoo.elide.core.datastore.DataStoreIterableBuilder in project elide by yahoo.
the class InMemoryStoreTransactionTest method testPaginationPushDown.
@Test
public void testPaginationPushDown() {
PaginationImpl pagination = new PaginationImpl(ClassType.of(Book.class), 0, 1, 10, 10, false, false);
EntityProjection projection = EntityProjection.builder().type(Book.class).pagination(pagination).build();
ArgumentCaptor<EntityProjection> projectionArgument = ArgumentCaptor.forClass(EntityProjection.class);
when(wrappedTransaction.loadObjects(any(), eq(scope))).thenReturn(new DataStoreIterableBuilder<>(books).build());
Collection<Object> loaded = Lists.newArrayList(inMemoryStoreTransaction.loadObjects(projection, scope));
verify(wrappedTransaction, times(1)).loadObjects(projectionArgument.capture(), eq(scope));
assertEquals(pagination, projectionArgument.getValue().getPagination());
assertEquals(3, loaded.size());
}
use of com.yahoo.elide.core.datastore.DataStoreIterableBuilder in project elide by yahoo.
the class InMemoryStoreTransactionTest method testTransactionRequiresInMemoryFilterDuringGetRelation.
@Test
public void testTransactionRequiresInMemoryFilterDuringGetRelation() {
FilterExpression expression = new InPredicate(new Path(Book.class, dictionary, "genre"), "Literary Fiction");
Relationship relationship = Relationship.builder().projection(EntityProjection.builder().type(Book.class).filterExpression(expression).build()).name("books").alias("books").build();
ArgumentCaptor<Relationship> relationshipArgument = ArgumentCaptor.forClass(Relationship.class);
when(scope.getNewPersistentResources()).thenReturn(Sets.newHashSet(mock(PersistentResource.class)));
when(wrappedTransaction.getToManyRelation(eq(inMemoryStoreTransaction), eq(author1), any(), eq(scope))).thenReturn(new DataStoreIterableBuilder<>(books).build());
Collection<Object> loaded = ImmutableList.copyOf((Iterable) inMemoryStoreTransaction.getToManyRelation(inMemoryStoreTransaction, author1, relationship, scope));
verify(wrappedTransaction, times(1)).getToManyRelation(eq(inMemoryStoreTransaction), eq(author1), relationshipArgument.capture(), eq(scope));
assertNull(relationshipArgument.getValue().getProjection().getFilterExpression());
assertNull(relationshipArgument.getValue().getProjection().getSorting());
assertNull(relationshipArgument.getValue().getProjection().getPagination());
assertEquals(2, loaded.size());
assertTrue(loaded.contains(book1));
assertTrue(loaded.contains(book3));
}
use of com.yahoo.elide.core.datastore.DataStoreIterableBuilder in project elide by yahoo.
the class InMemoryStoreTransaction method sortAndPaginateLoadedData.
private DataStoreIterable<Object> sortAndPaginateLoadedData(DataStoreIterable<Object> loadedRecords, boolean sortingInMemory, Sorting sorting, Pagination pagination, RequestScope scope) {
Map<Path, Sorting.SortOrder> sortRules = sorting == null ? new HashMap<>() : sorting.getSortingPaths();
boolean mustSortInMemory = !sortRules.isEmpty() && (sortingInMemory || loadedRecords.needsInMemorySort());
boolean mustPaginateInMemory = pagination != null && (mustSortInMemory || loadedRecords.needsInMemoryPagination());
// Try to skip the data copy if possible
if (!mustSortInMemory && !mustPaginateInMemory) {
return loadedRecords;
}
// We need an in memory copy to sort or paginate.
List<Object> results = StreamSupport.stream(loadedRecords.spliterator(), false).collect(Collectors.toList());
if (!sortRules.isEmpty()) {
results = sortInMemory(results, sortRules, scope);
}
if (pagination != null) {
results = paginateInMemory(results, pagination);
}
return new DataStoreIterableBuilder(results).build();
}
Aggregations