embulk-input-mongodb 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 669b8b7010ff112526a166dd4eef85a50656e77f
4
- data.tar.gz: adea0810c4f04ee5cec5ec8ba7414557a8f179a2
3
+ metadata.gz: 50b7c55abdaeb8b32b0db09e8fdc8c87846ebc1a
4
+ data.tar.gz: 360dce308e8b5cfa97d8d6075cec6d4b05fc09cc
5
5
  SHA512:
6
- metadata.gz: b8fad0bab206efc47861e6cb714c1def66cbfcb7440e042584daf454f84ef2673cdd2c8482bb3edfe3920d3bf82827c99c6cccb06d2890ea2a823be8122fffe8
7
- data.tar.gz: 277157cc6382dbb98795f6e3e0ef3aaa14a31faec1f663069d9bc133f4b246a6cb73da39a2e5c5b7f80a36ae4ade7145cd01464b9c9feec896eb205dbec2ba7b
6
+ metadata.gz: 0e0e2d69147d2a7c571c6798d6d7485d28460b958fa4288380070841264bb229d55970f94a506d9d35a069de55017ab8d7e781ddf6ec57073bd8919be4334848
7
+ data.tar.gz: ae60160723083ca1ba44b2301205bd45b31c3c96fd71f8e66995ac1f10dfcff5307c8899cfed97bf199dc8eae22b81070f13a3518952a6fb4e5b832546b4cbeb
data/.travis.yml CHANGED
@@ -12,6 +12,7 @@ env:
12
12
  - MONGO_URI=mongodb://localhost:27017/my_database
13
13
 
14
14
  sudo: required
15
+ dist: precise
15
16
 
16
17
  before_cache:
17
18
  - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
data/README.md CHANGED
@@ -41,7 +41,7 @@ This plugin only works with embulk >= 0.8.8.
41
41
  - **incremental_field** List of field name (list, optional, can't use with sort option)
42
42
  - **last_record** Last loaded record for incremental load (hash, optional)
43
43
  - **stop_on_invalid_record** Stop bulk load transaction if a document includes invalid record (such as unsupported object type) (boolean, optional, default: false)
44
- - **json_column_name**: column name used in outputs (string, optional, default: "json")
44
+ - **json_column_name**: column name used in outputs (string, optional, default: "record")
45
45
 
46
46
  ## Example
47
47
 
data/build.gradle CHANGED
@@ -17,7 +17,7 @@ configurations {
17
17
  provided
18
18
  }
19
19
 
20
- version = "0.5.0"
20
+ version = "0.5.1"
21
21
 
22
22
  sourceCompatibility = 1.7
23
23
  targetCompatibility = 1.7
Binary file
@@ -1,6 +1,6 @@
1
- #Tue Aug 04 15:25:00 JST 2015
1
+ #Sun Jan 08 00:35:58 PST 2017
2
2
  distributionBase=GRADLE_USER_HOME
3
3
  distributionPath=wrapper/dists
4
4
  zipStoreBase=GRADLE_USER_HOME
5
5
  zipStorePath=wrapper/dists
6
- distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
6
+ distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip
@@ -110,6 +110,14 @@ public class MongodbInputPlugin
110
110
  String getSort();
111
111
  void setSort(String sort);
112
112
 
113
+ @Config("limit")
114
+ @ConfigDefault("null")
115
+ Optional<Integer> getLimit();
116
+
117
+ @Config("skip")
118
+ @ConfigDefault("null")
119
+ Optional<Integer> getSkip();
120
+
113
121
  @Config("id_field_name")
114
122
  @ConfigDefault("\"_id\"")
115
123
  String getIdFieldName();
@@ -152,6 +160,9 @@ public class MongodbInputPlugin
152
160
  if (task.getIncrementalField().isPresent() && !task.getSort().equals("{}")) {
153
161
  throw new ConfigException("both of sort and incremental_load can't be used together");
154
162
  }
163
+ if (task.getIncrementalField().isPresent() && task.getSkip().isPresent()) {
164
+ throw new ConfigException("both of skip and incremental_load can't be used together");
165
+ }
155
166
 
156
167
  Map<String, String> newCondition = buildIncrementalCondition(task);
157
168
  task.setQuery(newCondition.get("query"));
@@ -228,12 +239,20 @@ public class MongodbInputPlugin
228
239
  log.trace("query: {}", query);
229
240
  log.trace("projection: {}", projection);
230
241
  log.trace("sort: {}", sort);
242
+ if (task.getLimit().isPresent()) {
243
+ log.trace("limit: {}", task.getLimit());
244
+ }
245
+ if (task.getSkip().isPresent()) {
246
+ log.trace("skip: {}", task.getSkip());
247
+ }
231
248
 
232
249
  try (MongoCursor<Value> cursor = collection
233
250
  .find(query)
234
251
  .projection(projection)
235
252
  .sort(sort)
236
253
  .batchSize(task.getBatchSize())
254
+ .limit(task.getLimit().or(0))
255
+ .skip(task.getSkip().or(0))
237
256
  .iterator()) {
238
257
  while (cursor.hasNext()) {
239
258
  pageBuilder.setJson(column, cursor.next());
@@ -97,6 +97,8 @@ public class TestMongodbInputPlugin
97
97
  PluginTask task = config.loadConfig(PluginTask.class);
98
98
  assertEquals("{}", task.getQuery());
99
99
  assertEquals("{}", task.getSort());
100
+ assertEquals(Optional.<Integer>absent(), task.getLimit());
101
+ assertEquals(Optional.<Integer>absent(), task.getSkip());
100
102
  assertEquals((long) 10000, (long) task.getBatchSize());
101
103
  assertEquals("record", task.getJsonColumnName());
102
104
  assertEquals(Optional.absent(), task.getIncrementalField());
@@ -134,7 +136,7 @@ public class TestMongodbInputPlugin
134
136
  }
135
137
 
136
138
  @Test(expected = ConfigException.class)
137
- public void checkInvalidOptionCombination()
139
+ public void checkSortCannotUseWithIncremental()
138
140
  {
139
141
  ConfigSource config = Exec.newConfigSource()
140
142
  .set("uri", MONGO_URI)
@@ -145,6 +147,18 @@ public class TestMongodbInputPlugin
145
147
  plugin.transaction(config, new Control());
146
148
  }
147
149
 
150
+ @Test(expected = ConfigException.class)
151
+ public void checkSkipCannotUseWithIncremental()
152
+ {
153
+ ConfigSource config = Exec.newConfigSource()
154
+ .set("uri", MONGO_URI)
155
+ .set("collection", MONGO_COLLECTION)
156
+ .set("skip", 10)
157
+ .set("incremental_field", Optional.of(Arrays.asList("account")));
158
+
159
+ plugin.transaction(config, new Control());
160
+ }
161
+
148
162
  @Test(expected = ConfigException.class)
149
163
  public void checkInvalidQueryOption()
150
164
  {
@@ -200,6 +214,41 @@ public class TestMongodbInputPlugin
200
214
  assertValidRecords(getFieldSchema(), output);
201
215
  }
202
216
 
217
+ @Test
218
+ public void testRunWithLimit() throws Exception
219
+ {
220
+ ConfigSource config = Exec.newConfigSource()
221
+ .set("uri", MONGO_URI)
222
+ .set("collection", MONGO_COLLECTION)
223
+ .set("limit", 1);
224
+ PluginTask task = config.loadConfig(PluginTask.class);
225
+
226
+ dropCollection(task, MONGO_COLLECTION);
227
+ createCollection(task, MONGO_COLLECTION);
228
+ insertDocument(task, createValidDocuments());
229
+
230
+ plugin.transaction(config, new Control());
231
+ assertValidRecords(getFieldSchema(), output, 1, 0);
232
+ }
233
+
234
+ @Test
235
+ public void testRunWithLimitSkip() throws Exception
236
+ {
237
+ ConfigSource config = Exec.newConfigSource()
238
+ .set("uri", MONGO_URI)
239
+ .set("collection", MONGO_COLLECTION)
240
+ .set("limit", 3)
241
+ .set("skip", 1);
242
+ PluginTask task = config.loadConfig(PluginTask.class);
243
+
244
+ dropCollection(task, MONGO_COLLECTION);
245
+ createCollection(task, MONGO_COLLECTION);
246
+ insertDocument(task, createValidDocuments());
247
+
248
+ plugin.transaction(config, new Control());
249
+ assertValidRecords(getFieldSchema(), output, 3, 1);
250
+ }
251
+
203
252
  @Test
204
253
  public void testRunWithConnectionParams() throws Exception
205
254
  {
@@ -228,7 +277,7 @@ public class TestMongodbInputPlugin
228
277
  ConfigSource config = Exec.newConfigSource()
229
278
  .set("uri", MONGO_URI)
230
279
  .set("collection", MONGO_COLLECTION)
231
- .set("incremental_field", Optional.of(Arrays.asList("int32_field", "double_field", "datetime_field", "boolean_field")));
280
+ .set("incremental_field", Optional.of(Arrays.asList("int32_field")));
232
281
  PluginTask task = config.loadConfig(PluginTask.class);
233
282
 
234
283
  dropCollection(task, MONGO_COLLECTION);
@@ -238,7 +287,28 @@ public class TestMongodbInputPlugin
238
287
  ConfigDiff diff = plugin.transaction(config, new Control());
239
288
  ConfigDiff lastRecord = diff.getNested("last_record");
240
289
 
241
- assertEquals("32864", lastRecord.get(String.class, "int32_field"));
290
+ assertEquals("5", lastRecord.get(String.class, "int32_field"));
291
+ }
292
+
293
+ @Test
294
+ public void testRunWithLimitIncrementalLoad() throws Exception
295
+ {
296
+ ConfigSource config = Exec.newConfigSource()
297
+ .set("uri", MONGO_URI)
298
+ .set("collection", MONGO_COLLECTION)
299
+ .set("id_field_name", "int32_field")
300
+ .set("incremental_field", Optional.of(Arrays.asList("int32_field", "double_field", "datetime_field", "boolean_field")))
301
+ .set("limit", 1);
302
+ PluginTask task = config.loadConfig(PluginTask.class);
303
+
304
+ dropCollection(task, MONGO_COLLECTION);
305
+ createCollection(task, MONGO_COLLECTION);
306
+ insertDocument(task, createValidDocuments());
307
+
308
+ ConfigDiff diff = plugin.transaction(config, new Control());
309
+ ConfigDiff lastRecord = diff.getNested("last_record");
310
+
311
+ assertEquals("1", lastRecord.get(String.class, "int32_field"));
242
312
  assertEquals("1.23", lastRecord.get(String.class, "double_field"));
243
313
  assertEquals("{$date=2015-01-27T10:23:49.000Z}", lastRecord.get(Map.class, "datetime_field").toString());
244
314
  assertEquals("true", lastRecord.get(String.class, "boolean_field"));
@@ -463,7 +533,7 @@ public class TestMongodbInputPlugin
463
533
  .append("null_field", null)
464
534
  .append("regex_field", new BsonRegularExpression(".+?"))
465
535
  .append("javascript_field", new BsonJavaScript("var s = \"javascript\";"))
466
- .append("int32_field", 32864)
536
+ .append("int32_field", 1)
467
537
  .append("timestamp_field", new BsonTimestamp(1463991177, 4))
468
538
  .append("int64_field", new BsonInt64(314159265))
469
539
  .append("document_field", new Document("k", true))
@@ -472,14 +542,24 @@ public class TestMongodbInputPlugin
472
542
 
473
543
  documents.add(
474
544
  new Document("boolean_field", false)
545
+ .append("int32_field", 2)
475
546
  .append("document_field", new Document("k", 1))
476
547
  );
477
548
 
478
- documents.add(new Document("document_field", new Document("k", 1.23)));
549
+ documents.add(
550
+ new Document("int32_field", 3)
551
+ .append("document_field", new Document("k", 1.23))
552
+ );
479
553
 
480
- documents.add(new Document("document_field", new Document("k", "v")));
554
+ documents.add(
555
+ new Document("int32_field", 4)
556
+ .append("document_field", new Document("k", "v"))
557
+ );
481
558
 
482
- documents.add(new Document("document_field", new Document("k", format.parse("2015-02-02T23:13:45.000Z"))));
559
+ documents.add(
560
+ new Document("int32_field", 5)
561
+ .append("document_field", new Document("k", format.parse("2015-02-02T23:13:45.000Z")))
562
+ );
483
563
 
484
564
  return documents;
485
565
  }
@@ -493,49 +573,60 @@ public class TestMongodbInputPlugin
493
573
 
494
574
  private void assertValidRecords(Schema schema, MockPageOutput output) throws Exception
495
575
  {
576
+ assertValidRecords(schema, output, 5, 0);
577
+ }
578
+
579
+ private void assertValidRecords(Schema schema, MockPageOutput output, int limit, int skip) throws Exception
580
+ {
581
+ int maxRecordSize = 5;
582
+ int actualRecordSize = Math.min(maxRecordSize - skip, limit);
496
583
  List<Object[]> records = Pages.toObjects(schema, output.pages);
497
- assertEquals(5, records.size());
584
+ assertEquals(actualRecordSize, records.size());
498
585
 
499
586
  ObjectMapper mapper = new ObjectMapper();
500
587
  mapper.setDateFormat(getUTCDateFormat());
501
588
 
502
- {
503
- JsonNode node = mapper.readTree(records.get(0)[0].toString());
504
- assertThat(1.23, is(node.get("double_field").asDouble()));
505
- assertEquals("embulk", node.get("string_field").asText());
506
- assertEquals("[1,2,3]", node.get("array_field").toString());
507
- assertEquals("test", node.get("binary_field").asText());
508
- assertEquals(true, node.get("boolean_field").asBoolean());
509
- assertEquals("2015-01-27T10:23:49.000Z", node.get("datetime_field").asText());
510
- assertEquals("null", node.get("null_field").asText());
511
- assertEquals("BsonRegularExpression{pattern='.+?', options=''}", node.get("regex_field").asText());
512
- assertEquals("var s = \"javascript\";", node.get("javascript_field").asText());
513
- assertEquals(32864L, node.get("int32_field").asLong());
514
- assertEquals("1463991177", node.get("timestamp_field").asText());
515
- assertEquals(314159265L, node.get("int64_field").asLong());
516
- assertEquals("{\"k\":true}", node.get("document_field").toString());
517
- assertEquals("symbol", node.get("symbol_field").asText());
518
- }
589
+ int recordIndex = 0;
590
+ for (int i = skip; i < actualRecordSize; i++) {
591
+ if (i == 0) {
592
+ JsonNode node = mapper.readTree(records.get(recordIndex)[0].toString());
593
+ assertThat(1.23, is(node.get("double_field").asDouble()));
594
+ assertEquals("embulk", node.get("string_field").asText());
595
+ assertEquals("[1,2,3]", node.get("array_field").toString());
596
+ assertEquals("test", node.get("binary_field").asText());
597
+ assertEquals(true, node.get("boolean_field").asBoolean());
598
+ assertEquals("2015-01-27T10:23:49.000Z", node.get("datetime_field").asText());
599
+ assertEquals("null", node.get("null_field").asText());
600
+ assertEquals("BsonRegularExpression{pattern='.+?', options=''}", node.get("regex_field").asText());
601
+ assertEquals("var s = \"javascript\";", node.get("javascript_field").asText());
602
+ assertEquals(1, node.get("int32_field").asLong());
603
+ assertEquals("1463991177", node.get("timestamp_field").asText());
604
+ assertEquals(314159265L, node.get("int64_field").asLong());
605
+ assertEquals("{\"k\":true}", node.get("document_field").toString());
606
+ assertEquals("symbol", node.get("symbol_field").asText());
607
+ }
519
608
 
520
- {
521
- JsonNode node = mapper.readTree(records.get(1)[0].toString());
522
- assertEquals(false, node.get("boolean_field").asBoolean());
523
- assertEquals("{\"k\":1}", node.get("document_field").toString());
524
- }
609
+ if (i == 1) {
610
+ JsonNode node = mapper.readTree(records.get(recordIndex)[0].toString());
611
+ assertEquals(false, node.get("boolean_field").asBoolean());
612
+ assertEquals("{\"k\":1}", node.get("document_field").toString());
613
+ }
525
614
 
526
- {
527
- JsonNode node = mapper.readTree(records.get(2)[0].toString());
528
- assertEquals("{\"k\":1.23}", node.get("document_field").toString());
529
- }
615
+ if (i == 2) {
616
+ JsonNode node = mapper.readTree(records.get(recordIndex)[0].toString());
617
+ assertEquals("{\"k\":1.23}", node.get("document_field").toString());
618
+ }
530
619
 
531
- {
532
- JsonNode node = mapper.readTree(records.get(3)[0].toString());
533
- assertEquals("{\"k\":\"v\"}", node.get("document_field").toString());
534
- }
620
+ if (i == 3) {
621
+ JsonNode node = mapper.readTree(records.get(recordIndex)[0].toString());
622
+ assertEquals("{\"k\":\"v\"}", node.get("document_field").toString());
623
+ }
535
624
 
536
- {
537
- JsonNode node = mapper.readTree(records.get(4)[0].toString());
538
- assertEquals("{\"k\":\"2015-02-02T23:13:45.000Z\"}", node.get("document_field").toString());
625
+ if (i == 4) {
626
+ JsonNode node = mapper.readTree(records.get(recordIndex)[0].toString());
627
+ assertEquals("{\"k\":\"2015-02-02T23:13:45.000Z\"}", node.get("document_field").toString());
628
+ }
629
+ recordIndex++;
539
630
  }
540
631
  }
541
632
 
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-input-mongodb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuyuki Honda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-23 00:00:00.000000000 Z
11
+ date: 2017-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- requirement: !ruby/object:Gem::Requirement
14
+ name: bundler
15
+ version_requirements: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - ~>
17
18
  - !ruby/object:Gem::Version
18
19
  version: '1.0'
19
- name: bundler
20
- prerelease: false
21
- type: :development
22
- version_requirements: !ruby/object:Gem::Requirement
20
+ requirement: !ruby/object:Gem::Requirement
23
21
  requirements:
24
22
  - - ~>
25
23
  - !ruby/object:Gem::Version
26
24
  version: '1.0'
25
+ prerelease: false
26
+ type: :development
27
27
  - !ruby/object:Gem::Dependency
28
- requirement: !ruby/object:Gem::Requirement
28
+ name: rake
29
+ version_requirements: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '10.0'
33
- name: rake
34
- prerelease: false
35
- type: :development
36
- version_requirements: !ruby/object:Gem::Requirement
34
+ requirement: !ruby/object:Gem::Requirement
37
35
  requirements:
38
36
  - - '>='
39
37
  - !ruby/object:Gem::Version
40
38
  version: '10.0'
39
+ prerelease: false
40
+ type: :development
41
41
  description: Loads records from Mongodb.
42
42
  email:
43
43
  - hakobera@gmail.com
@@ -68,7 +68,7 @@ files:
68
68
  - src/test/resources/id_field_name.yml
69
69
  - src/test/resources/id_field_name_expected.csv
70
70
  - src/test/resources/my_collection.jsonl
71
- - classpath/embulk-input-mongodb-0.5.0.jar
71
+ - classpath/embulk-input-mongodb-0.5.1.jar
72
72
  - classpath/mongo-java-driver-3.2.2.jar
73
73
  homepage: https://github.com/hakobera/embulk-input-mongodb
74
74
  licenses: