public void testLoadSolrWithPartialUpdate() throws Exception {
morphline = createMorphline("test-morphlines" + File.separator + "loadSolrBasic");
// insert a document with a bunch of fields
Record record = new Record();
record.put(Fields.ID, "id0");
record.put("user_friends_count", 123);
record.put("text", "myText");
Notifications.notifyBeginTransaction(morphline);
assertTrue(morphline.process(record));
assertEquals(1, collector.getRecords().size());
assertEquals(1, query("*:*").getResults().size());
// remove "text" field; retain other fields as-is
record = new Record();
record.put(Fields.ID, "id0");
Map<String, Object> map = new HashMap();
map.put("set", null);
record.put("text", map);
assertTrue(morphline.process(record));
SolrDocumentList docs = query("*:*").getResults();
assertEquals(1, docs.size());
assertEquals("id0", docs.get(0).getFirstValue(Fields.ID));
assertEquals(123, docs.get(0).getFirstValue("user_friends_count"));
assertNull(docs.get(0).getFieldValue("text"));
// set "text" field to "hello world"; retain other fields as-is
record = new Record();
record.put(Fields.ID, "id0");
record.put("text", Collections.singletonMap("set", "hello world"));
assertTrue(morphline.process(record));
docs = query("*:*").getResults();
assertEquals(1, docs.size());
assertEquals("id0", docs.get(0).getFirstValue(Fields.ID));
assertEquals(123, docs.get(0).getFirstValue("user_friends_count"));
assertEquals("hello world", docs.get(0).getFirstValue("text"));
// add "goodbye moon" to text field; retain other fields as-is
record = new Record();
record.put(Fields.ID, "id0");
record.put("text", ImmutableMap.of("add", "goodbye moon"));
assertTrue(morphline.process(record));
docs = query("*:*").getResults();
assertEquals(1, docs.size());
assertEquals("id0", docs.get(0).getFirstValue(Fields.ID));
assertEquals(123, docs.get(0).getFirstValue("user_friends_count"));
assertEquals(Arrays.asList("hello world", "goodbye moon"), docs.get(0).get("text"));
// set "text" field to multiple values ["hello sun", "goodbye mars"]; retain other fields as-is
record = new Record();
record.put(Fields.ID, "id0");
record.put("text", ImmutableMap.of("set", Arrays.asList("hello sun", "goodbye mars")));
assertTrue(morphline.process(record));
docs = query("*:*").getResults();
assertEquals(1, docs.size());
assertEquals("id0", docs.get(0).getFirstValue(Fields.ID));
assertEquals(123, docs.get(0).getFirstValue("user_friends_count"));
assertEquals(Arrays.asList("hello sun", "goodbye mars"), docs.get(0).getFieldValue("text"));
// increment user_friends_count by 5; retain other fields as-is
record = new Record();
record.put(Fields.ID, "id0");
record.put("user_friends_count", ImmutableMap.of("inc", 5));
assertTrue(morphline.process(record));
docs = query("*:*").getResults();
assertEquals(1, docs.size());
assertEquals("id0", docs.get(0).getFirstValue(Fields.ID));
assertEquals(128, docs.get(0).getFirstValue("user_friends_count"));