BATCH-2206: Added option to set collection for MongoItemReader

This commit is contained in:
Michael Minella
2014-05-21 21:30:05 -05:00
parent f5d5edc52d
commit ca8087dfc6
2 changed files with 55 additions and 20 deletions

View File

@@ -16,13 +16,7 @@
package org.springframework.batch.item.data;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.mongodb.util.JSON;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.beans.factory.InitializingBean;
@@ -36,7 +30,12 @@ import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import com.mongodb.util.JSON;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <p>
@@ -75,6 +74,7 @@ public class MongoItemReader<T> extends AbstractPaginatedDataItemReader<T> imple
private Sort sort;
private String hint;
private String fields;
private String collection;
private List<Object> parameterValues;
public MongoItemReader() {
@@ -143,6 +143,13 @@ public class MongoItemReader<T> extends AbstractPaginatedDataItemReader<T> imple
this.sort = convertToSort(sorts);
}
/**
* @param collection Mongo collection to be queried.
*/
public void setCollection(String collection) {
this.collection = collection;
}
/**
* JSON String telling MongoDB what index to use.
*
@@ -175,7 +182,11 @@ public class MongoItemReader<T> extends AbstractPaginatedDataItemReader<T> imple
mongoQuery.withHint(hint);
}
return (Iterator<T>) template.find(mongoQuery, type).iterator();
if(StringUtils.hasText(collection)) {
return (Iterator<T>) template.find(mongoQuery, type, collection).iterator();
} else {
return (Iterator<T>) template.find(mongoQuery, type).iterator();
}
}
/**

View File

@@ -15,17 +15,6 @@
*/
package org.springframework.batch.item.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -35,6 +24,17 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Query;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
public class MongoItemReaderTests {
private MongoItemReader<String> reader;
@@ -196,4 +196,28 @@ public class MongoItemReaderTests {
assertEquals("{ \"name\" : \"foo\"}", query.getQueryObject().toString());
assertEquals("{ \"name\" : -1}", query.getSortObject().toString());
}
@SuppressWarnings("serial")
@Test
public void testQueryWithCollection() {
reader.setParameterValues(new ArrayList<Object>(){{
add("foo");
}});
reader.setQuery("{ name : ?0 }");
reader.setCollection("collection");
ArgumentCaptor<Query> queryContainer = ArgumentCaptor.forClass(Query.class);
ArgumentCaptor<String> collectionContainer = ArgumentCaptor.forClass(String.class);
when(template.find(queryContainer.capture(), eq(String.class), collectionContainer.capture())).thenReturn(new ArrayList<String>());
assertFalse(reader.doPageRead().hasNext());
Query query = queryContainer.getValue();
assertEquals(50, query.getLimit());
assertEquals(0, query.getSkip());
assertEquals("{ \"name\" : \"foo\"}", query.getQueryObject().toString());
assertEquals("{ \"name\" : -1}", query.getSortObject().toString());
assertEquals("collection", collectionContainer.getValue());
}
}