embulk-input-mongodb 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +25 -8
- data/README.md +1 -0
- data/build.gradle +19 -1
- data/classpath/embulk-input-mongodb-0.3.1.jar +0 -0
- data/config/checkstyle/checkstyle.xml +130 -0
- data/config/checkstyle/default.xml +110 -0
- data/gradle/wrapper/gradle-wrapper.properties +1 -1
- data/src/main/java/org/embulk/input/mongodb/MongodbInputPlugin.java +17 -6
- data/src/main/java/org/embulk/input/mongodb/ValueCodec.java +25 -27
- data/src/test/java/org/embulk/input/mongodb/TestMongodbInputPlugin.java +82 -39
- data/src/test/resources/id_field_name.yml +18 -0
- data/src/test/resources/id_field_name_expected.csv +8 -0
- metadata +7 -3
- data/classpath/embulk-input-mongodb-0.3.0.jar +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b2a60bb559e33bfa9fb7e8f9f0b6453e070d995e
         | 
| 4 | 
            +
              data.tar.gz: b6da249c33d89b3a84d070f48e18a97243061bf5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1c3a1f2a3ae383587c548d5e7fcae302eeb17275e784498958e04436fc3e86fc49f2aa4197d2fae3436c009425c9414d4ee1bb358fd9bd2811241b4484c5f644
         | 
| 7 | 
            +
              data.tar.gz: 89d72c6f271dfbfed98fbf5ffbbb72851cc4d48aaa4af202a1fb09fe07caaefd2f835b2a94ee7c3ac733992b5a3ec1233ace1ac45221fb50284263f20452387c
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -5,8 +5,22 @@ jdk: | |
| 5 5 | 
             
              - oraclejdk7
         | 
| 6 6 | 
             
              - openjdk7
         | 
| 7 7 |  | 
| 8 | 
            +
            env:
         | 
| 9 | 
            +
              global:
         | 
| 10 | 
            +
                - MONGO_DATABASE=my_database
         | 
| 11 | 
            +
                - MONGO_COLLECTION=my_collection
         | 
| 12 | 
            +
                - MONGO_URI=mongodb://localhost:27017/my_database
         | 
| 13 | 
            +
             | 
| 8 14 | 
             
            sudo: required
         | 
| 9 15 |  | 
| 16 | 
            +
            before_cache:
         | 
| 17 | 
            +
              - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
         | 
| 18 | 
            +
              - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
         | 
| 19 | 
            +
            cache:
         | 
| 20 | 
            +
              directories:
         | 
| 21 | 
            +
                - $HOME/.gradle/caches/
         | 
| 22 | 
            +
                - $HOME/.gradle/wrapper/
         | 
| 23 | 
            +
             | 
| 10 24 | 
             
            # Work around fix for buffer overflow error on OpenJDK7
         | 
| 11 25 | 
             
            # ref: https://github.com/travis-ci/travis-ci/issues/5227#issuecomment-165131913
         | 
| 12 26 | 
             
            before_install:
         | 
| @@ -29,14 +43,17 @@ install: | |
| 29 43 | 
             
            before_script:
         | 
| 30 44 | 
             
              - echo "Wait mongodb wakeup"
         | 
| 31 45 | 
             
              - sleep 10
         | 
| 32 | 
            -
              - mongoimport --db my_database --collection my_collection --type json --drop src/test/resources/my_collection.jsonl
         | 
| 33 | 
            -
              - ./gradlew package
         | 
| 34 46 | 
             
              - mkdir -p ./tmp
         | 
| 47 | 
            +
              - date
         | 
| 35 48 |  | 
| 36 49 | 
             
            script:
         | 
| 37 | 
            -
              -  | 
| 38 | 
            -
              -  | 
| 39 | 
            -
              -  | 
| 40 | 
            -
              -  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 50 | 
            +
              - ./gradlew check
         | 
| 51 | 
            +
              - ./gradlew package
         | 
| 52 | 
            +
              - mongoimport --db $MONGO_DATABASE --collection $MONGO_COLLECTION --type json --drop src/test/resources/my_collection.jsonl
         | 
| 53 | 
            +
              - |
         | 
| 54 | 
            +
                for target in basic full id_field_name
         | 
| 55 | 
            +
                do
         | 
| 56 | 
            +
                  embulk run -L . src/test/resources/${target}.yml
         | 
| 57 | 
            +
                  cat tmp/${target}000.00.csv
         | 
| 58 | 
            +
                  cmp tmp/${target}000.00.csv src/test/resources/${target}_expected.csv
         | 
| 59 | 
            +
                done
         | 
    
        data/README.md
    CHANGED
    
    | @@ -24,6 +24,7 @@ This plugin only works with embulk >= 0.8.8. | |
| 24 24 | 
             
                ~~- double~~
         | 
| 25 25 | 
             
                ~~- string~~
         | 
| 26 26 | 
             
                ~~- timestamp~~
         | 
| 27 | 
            +
            - **id_field_name** (string, optional, default: "_id") Name of Object ID field name. Set if you want to change the default name `_id` 
         | 
| 27 28 | 
             
            - **query**: a JSON document used for [querying](https://docs.mongodb.com/manual/tutorial/query-documents/) on the source collection. Documents are loaded from the colleciton if they match with this condition. (string, optional)
         | 
| 28 29 | 
             
            - **projection**: A JSON document used for [projection](https://docs.mongodb.com/manual/reference/operator/projection/positional/) on query results. Fields in a document are used only if they match with this condition. (string, optional)
         | 
| 29 30 | 
             
            - **sort**: ordering of results (string, optional)
         | 
    
        data/build.gradle
    CHANGED
    
    | @@ -2,6 +2,7 @@ plugins { | |
| 2 2 | 
             
                id "com.jfrog.bintray" version "1.1"
         | 
| 3 3 | 
             
                id "com.github.jruby-gradle.base" version "0.1.5"
         | 
| 4 4 | 
             
                id "java"
         | 
| 5 | 
            +
                id "checkstyle"
         | 
| 5 6 | 
             
                id "jacoco"
         | 
| 6 7 | 
             
            }
         | 
| 7 8 | 
             
            import com.github.jrubygradle.JRubyExec
         | 
| @@ -16,7 +17,7 @@ configurations { | |
| 16 17 | 
             
                provided
         | 
| 17 18 | 
             
            }
         | 
| 18 19 |  | 
| 19 | 
            -
            version = "0.3. | 
| 20 | 
            +
            version = "0.3.1"
         | 
| 20 21 |  | 
| 21 22 | 
             
            sourceCompatibility = 1.7
         | 
| 22 23 | 
             
            targetCompatibility = 1.7
         | 
| @@ -38,6 +39,23 @@ task classpath(type: Copy, dependsOn: ["jar"]) { | |
| 38 39 | 
             
            }
         | 
| 39 40 | 
             
            clean { delete "classpath" }
         | 
| 40 41 |  | 
| 42 | 
            +
            checkstyle {
         | 
| 43 | 
            +
                configFile = file("${project.rootDir}/config/checkstyle/checkstyle.xml")
         | 
| 44 | 
            +
                toolVersion = '6.14.1'
         | 
| 45 | 
            +
            }
         | 
| 46 | 
            +
            checkstyleMain {
         | 
| 47 | 
            +
                configFile = file("${project.rootDir}/config/checkstyle/default.xml")
         | 
| 48 | 
            +
                ignoreFailures = true
         | 
| 49 | 
            +
            }
         | 
| 50 | 
            +
            checkstyleTest {
         | 
| 51 | 
            +
                configFile = file("${project.rootDir}/config/checkstyle/default.xml")
         | 
| 52 | 
            +
                ignoreFailures = true
         | 
| 53 | 
            +
            }
         | 
| 54 | 
            +
            task checkstyle(type: Checkstyle) {
         | 
| 55 | 
            +
                classpath = sourceSets.main.output + sourceSets.test.output
         | 
| 56 | 
            +
                source = sourceSets.main.allJava + sourceSets.test.allJava
         | 
| 57 | 
            +
            }
         | 
| 58 | 
            +
             | 
| 41 59 | 
             
            task gem(type: JRubyExec, dependsOn: ["gemspec", "classpath"]) {
         | 
| 42 60 | 
             
                jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "build"
         | 
| 43 61 | 
             
                script "${project.name}.gemspec"
         | 
| Binary file | 
| @@ -0,0 +1,130 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <!DOCTYPE module PUBLIC
         | 
| 3 | 
            +
                    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
         | 
| 4 | 
            +
                    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
         | 
| 5 | 
            +
            <module name="Checker">
         | 
| 6 | 
            +
                <!-- https://github.com/facebook/presto/blob/master/src/checkstyle/checks.xml -->
         | 
| 7 | 
            +
                <module name="FileTabCharacter"/>
         | 
| 8 | 
            +
                <module name="NewlineAtEndOfFile">
         | 
| 9 | 
            +
                    <property name="lineSeparator" value="lf"/>
         | 
| 10 | 
            +
                </module>
         | 
| 11 | 
            +
                <module name="RegexpMultiline">
         | 
| 12 | 
            +
                    <property name="format" value="\r"/>
         | 
| 13 | 
            +
                    <property name="message" value="Line contains carriage return"/>
         | 
| 14 | 
            +
                </module>
         | 
| 15 | 
            +
                <module name="RegexpMultiline">
         | 
| 16 | 
            +
                    <property name="format" value=" \n"/>
         | 
| 17 | 
            +
                    <property name="message" value="Line has trailing whitespace"/>
         | 
| 18 | 
            +
                </module>
         | 
| 19 | 
            +
                <module name="RegexpMultiline">
         | 
| 20 | 
            +
                    <property name="format" value="\{\n\n"/>
         | 
| 21 | 
            +
                    <property name="message" value="Blank line after opening brace"/>
         | 
| 22 | 
            +
                </module>
         | 
| 23 | 
            +
                <module name="RegexpMultiline">
         | 
| 24 | 
            +
                    <property name="format" value="\n\n\s*\}"/>
         | 
| 25 | 
            +
                    <property name="message" value="Blank line before closing brace"/>
         | 
| 26 | 
            +
                </module>
         | 
| 27 | 
            +
                <module name="RegexpMultiline">
         | 
| 28 | 
            +
                    <property name="format" value="\n\n\n"/>
         | 
| 29 | 
            +
                    <property name="message" value="Multiple consecutive blank lines"/>
         | 
| 30 | 
            +
                </module>
         | 
| 31 | 
            +
                <module name="RegexpMultiline">
         | 
| 32 | 
            +
                    <property name="format" value="\n\n\Z"/>
         | 
| 33 | 
            +
                    <property name="message" value="Blank line before end of file"/>
         | 
| 34 | 
            +
                </module>
         | 
| 35 | 
            +
                <module name="RegexpMultiline">
         | 
| 36 | 
            +
                    <property name="format" value="Preconditions\.checkNotNull"/>
         | 
| 37 | 
            +
                    <property name="message" value="Use of checkNotNull"/>
         | 
| 38 | 
            +
                </module>
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                <module name="TreeWalker">
         | 
| 41 | 
            +
                    <module name="EmptyBlock">
         | 
| 42 | 
            +
                        <property name="option" value="text"/>
         | 
| 43 | 
            +
                        <property name="tokens" value="
         | 
| 44 | 
            +
                            LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF,
         | 
| 45 | 
            +
                            LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
         | 
| 46 | 
            +
                    </module>
         | 
| 47 | 
            +
                    <module name="EmptyStatement"/>
         | 
| 48 | 
            +
                    <module name="EmptyForInitializerPad"/>
         | 
| 49 | 
            +
                    <module name="EmptyForIteratorPad">
         | 
| 50 | 
            +
                        <property name="option" value="space"/>
         | 
| 51 | 
            +
                    </module>
         | 
| 52 | 
            +
                    <module name="MethodParamPad">
         | 
| 53 | 
            +
                        <property name="allowLineBreaks" value="true"/>
         | 
| 54 | 
            +
                        <property name="option" value="nospace"/>
         | 
| 55 | 
            +
                    </module>
         | 
| 56 | 
            +
                    <module name="ParenPad"/>
         | 
| 57 | 
            +
                    <module name="TypecastParenPad"/>
         | 
| 58 | 
            +
                    <module name="NeedBraces"/>
         | 
| 59 | 
            +
                    <module name="LeftCurly">
         | 
| 60 | 
            +
                        <property name="option" value="nl"/>
         | 
| 61 | 
            +
                        <property name="tokens" value="CLASS_DEF, CTOR_DEF, INTERFACE_DEF, METHOD_DEF"/>
         | 
| 62 | 
            +
                    </module>
         | 
| 63 | 
            +
                    <module name="LeftCurly">
         | 
| 64 | 
            +
                        <property name="option" value="eol"/>
         | 
| 65 | 
            +
                        <property name="tokens" value="
         | 
| 66 | 
            +
                             LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR,
         | 
| 67 | 
            +
                             LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE"/>
         | 
| 68 | 
            +
                    </module>
         | 
| 69 | 
            +
                    <module name="RightCurly">
         | 
| 70 | 
            +
                        <property name="option" value="alone"/>
         | 
| 71 | 
            +
                    </module>
         | 
| 72 | 
            +
                    <module name="GenericWhitespace"/>
         | 
| 73 | 
            +
                    <module name="WhitespaceAfter"/>
         | 
| 74 | 
            +
                    <module name="NoWhitespaceBefore"/>
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    <module name="UpperEll"/>
         | 
| 77 | 
            +
                    <module name="DefaultComesLast"/>
         | 
| 78 | 
            +
                    <module name="ArrayTypeStyle"/>
         | 
| 79 | 
            +
                    <module name="MultipleVariableDeclarations"/>
         | 
| 80 | 
            +
                    <module name="ModifierOrder"/>
         | 
| 81 | 
            +
                    <module name="OneStatementPerLine"/>
         | 
| 82 | 
            +
                    <module name="StringLiteralEquality"/>
         | 
| 83 | 
            +
                    <module name="MutableException"/>
         | 
| 84 | 
            +
                    <module name="EqualsHashCode"/>
         | 
| 85 | 
            +
                    <module name="InnerAssignment"/>
         | 
| 86 | 
            +
                    <module name="InterfaceIsType"/>
         | 
| 87 | 
            +
                    <module name="HideUtilityClassConstructor"/>
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    <module name="MemberName"/>
         | 
| 90 | 
            +
                    <module name="LocalVariableName"/>
         | 
| 91 | 
            +
                    <module name="LocalFinalVariableName"/>
         | 
| 92 | 
            +
                    <module name="TypeName"/>
         | 
| 93 | 
            +
                    <module name="PackageName"/>
         | 
| 94 | 
            +
                    <module name="ParameterName"/>
         | 
| 95 | 
            +
                    <module name="StaticVariableName">
         | 
| 96 | 
            +
                        <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
         | 
| 97 | 
            +
                    </module>
         | 
| 98 | 
            +
                    <module name="ClassTypeParameterName">
         | 
| 99 | 
            +
                        <property name="format" value="^[A-Z][0-9]?$"/>
         | 
| 100 | 
            +
                    </module>
         | 
| 101 | 
            +
                    <module name="MethodTypeParameterName">
         | 
| 102 | 
            +
                        <property name="format" value="^[A-Z][0-9]?$"/>
         | 
| 103 | 
            +
                    </module>
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    <module name="AvoidStarImport"/>
         | 
| 106 | 
            +
                    <module name="RedundantImport"/>
         | 
| 107 | 
            +
                    <module name="UnusedImports"/>
         | 
| 108 | 
            +
                    <module name="ImportOrder">
         | 
| 109 | 
            +
                        <property name="groups" value="*,javax,java"/>
         | 
| 110 | 
            +
                        <property name="separated" value="true"/>
         | 
| 111 | 
            +
                        <property name="option" value="bottom"/>
         | 
| 112 | 
            +
                        <property name="sortStaticImportsAlphabetically" value="true"/>
         | 
| 113 | 
            +
                    </module>
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                    <module name="WhitespaceAround">
         | 
| 116 | 
            +
                        <property name="allowEmptyConstructors" value="true"/>
         | 
| 117 | 
            +
                        <property name="allowEmptyMethods" value="true"/>
         | 
| 118 | 
            +
                        <property name="ignoreEnhancedForColon" value="false"/>
         | 
| 119 | 
            +
                        <property name="tokens" value="
         | 
| 120 | 
            +
                            ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
         | 
| 121 | 
            +
                            BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LE,
         | 
| 122 | 
            +
                            LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
         | 
| 123 | 
            +
                            LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
         | 
| 124 | 
            +
                            LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
         | 
| 125 | 
            +
                            LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL,
         | 
| 126 | 
            +
                            PLUS, PLUS_ASSIGN, QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN,
         | 
| 127 | 
            +
                            STAR, STAR_ASSIGN, TYPE_EXTENSION_AND"/>
         | 
| 128 | 
            +
                    </module>
         | 
| 129 | 
            +
                </module>
         | 
| 130 | 
            +
            </module>
         | 
| @@ -0,0 +1,110 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <!DOCTYPE module PUBLIC
         | 
| 3 | 
            +
                    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
         | 
| 4 | 
            +
                    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
         | 
| 5 | 
            +
            <!--
         | 
| 6 | 
            +
                 This is a subset of ./checkstyle.xml which allows some loose styles
         | 
| 7 | 
            +
            -->
         | 
| 8 | 
            +
            <module name="Checker">
         | 
| 9 | 
            +
                <module name="FileTabCharacter"/>
         | 
| 10 | 
            +
                <module name="NewlineAtEndOfFile">
         | 
| 11 | 
            +
                    <property name="lineSeparator" value="lf"/>
         | 
| 12 | 
            +
                </module>
         | 
| 13 | 
            +
                <module name="RegexpMultiline">
         | 
| 14 | 
            +
                    <property name="format" value="\r"/>
         | 
| 15 | 
            +
                    <property name="message" value="Line contains carriage return"/>
         | 
| 16 | 
            +
                </module>
         | 
| 17 | 
            +
                <module name="RegexpMultiline">
         | 
| 18 | 
            +
                    <property name="format" value=" \n"/>
         | 
| 19 | 
            +
                    <property name="message" value="Line has trailing whitespace"/>
         | 
| 20 | 
            +
                </module>
         | 
| 21 | 
            +
                <module name="RegexpMultiline">
         | 
| 22 | 
            +
                    <property name="format" value="\n\n\n"/>
         | 
| 23 | 
            +
                    <property name="message" value="Multiple consecutive blank lines"/>
         | 
| 24 | 
            +
                </module>
         | 
| 25 | 
            +
                <module name="RegexpMultiline">
         | 
| 26 | 
            +
                    <property name="format" value="\n\n\Z"/>
         | 
| 27 | 
            +
                    <property name="message" value="Blank line before end of file"/>
         | 
| 28 | 
            +
                </module>
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                <module name="TreeWalker">
         | 
| 31 | 
            +
                    <module name="EmptyBlock">
         | 
| 32 | 
            +
                        <property name="option" value="text"/>
         | 
| 33 | 
            +
                        <property name="tokens" value="
         | 
| 34 | 
            +
                            LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF,
         | 
| 35 | 
            +
                            LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
         | 
| 36 | 
            +
                    </module>
         | 
| 37 | 
            +
                    <module name="EmptyStatement"/>
         | 
| 38 | 
            +
                    <module name="EmptyForInitializerPad"/>
         | 
| 39 | 
            +
                    <module name="EmptyForIteratorPad">
         | 
| 40 | 
            +
                        <property name="option" value="space"/>
         | 
| 41 | 
            +
                    </module>
         | 
| 42 | 
            +
                    <module name="MethodParamPad">
         | 
| 43 | 
            +
                        <property name="allowLineBreaks" value="true"/>
         | 
| 44 | 
            +
                        <property name="option" value="nospace"/>
         | 
| 45 | 
            +
                    </module>
         | 
| 46 | 
            +
                    <module name="ParenPad"/>
         | 
| 47 | 
            +
                    <module name="TypecastParenPad"/>
         | 
| 48 | 
            +
                    <module name="NeedBraces"/>
         | 
| 49 | 
            +
                    <module name="LeftCurly">
         | 
| 50 | 
            +
                        <property name="option" value="nl"/>
         | 
| 51 | 
            +
                        <property name="tokens" value="CLASS_DEF, CTOR_DEF, INTERFACE_DEF, METHOD_DEF"/>
         | 
| 52 | 
            +
                    </module>
         | 
| 53 | 
            +
                    <module name="LeftCurly">
         | 
| 54 | 
            +
                        <property name="option" value="eol"/>
         | 
| 55 | 
            +
                        <property name="tokens" value="
         | 
| 56 | 
            +
                             LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR,
         | 
| 57 | 
            +
                             LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE"/>
         | 
| 58 | 
            +
                    </module>
         | 
| 59 | 
            +
                    <module name="RightCurly">
         | 
| 60 | 
            +
                        <property name="option" value="alone"/>
         | 
| 61 | 
            +
                    </module>
         | 
| 62 | 
            +
                    <module name="GenericWhitespace"/>
         | 
| 63 | 
            +
                    <module name="WhitespaceAfter"/>
         | 
| 64 | 
            +
                    <module name="NoWhitespaceBefore"/>
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    <module name="UpperEll"/>
         | 
| 67 | 
            +
                    <module name="DefaultComesLast"/>
         | 
| 68 | 
            +
                    <module name="ArrayTypeStyle"/>
         | 
| 69 | 
            +
                    <module name="MultipleVariableDeclarations"/>
         | 
| 70 | 
            +
                    <module name="ModifierOrder"/>
         | 
| 71 | 
            +
                    <module name="OneStatementPerLine"/>
         | 
| 72 | 
            +
                    <module name="StringLiteralEquality"/>
         | 
| 73 | 
            +
                    <module name="MutableException"/>
         | 
| 74 | 
            +
                    <module name="EqualsHashCode"/>
         | 
| 75 | 
            +
                    <module name="InnerAssignment"/>
         | 
| 76 | 
            +
                    <module name="InterfaceIsType"/>
         | 
| 77 | 
            +
                    <module name="HideUtilityClassConstructor"/>
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    <module name="MemberName"/>
         | 
| 80 | 
            +
                    <module name="LocalVariableName"/>
         | 
| 81 | 
            +
                    <module name="LocalFinalVariableName"/>
         | 
| 82 | 
            +
                    <module name="TypeName"/>
         | 
| 83 | 
            +
                    <module name="PackageName"/>
         | 
| 84 | 
            +
                    <module name="ParameterName"/>
         | 
| 85 | 
            +
                    <module name="StaticVariableName">
         | 
| 86 | 
            +
                        <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
         | 
| 87 | 
            +
                    </module>
         | 
| 88 | 
            +
                    <module name="ClassTypeParameterName">
         | 
| 89 | 
            +
                        <property name="format" value="^[A-Z][0-9]?$"/>
         | 
| 90 | 
            +
                    </module>
         | 
| 91 | 
            +
                    <module name="MethodTypeParameterName">
         | 
| 92 | 
            +
                        <property name="format" value="^[A-Z][0-9]?$"/>
         | 
| 93 | 
            +
                    </module>
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                    <module name="WhitespaceAround">
         | 
| 96 | 
            +
                        <property name="allowEmptyConstructors" value="true"/>
         | 
| 97 | 
            +
                        <property name="allowEmptyMethods" value="true"/>
         | 
| 98 | 
            +
                        <property name="ignoreEnhancedForColon" value="false"/>
         | 
| 99 | 
            +
                        <property name="tokens" value="
         | 
| 100 | 
            +
                            ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
         | 
| 101 | 
            +
                            BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LE,
         | 
| 102 | 
            +
                            LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
         | 
| 103 | 
            +
                            LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
         | 
| 104 | 
            +
                            LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
         | 
| 105 | 
            +
                            LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL,
         | 
| 106 | 
            +
                            PLUS, PLUS_ASSIGN, QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN,
         | 
| 107 | 
            +
                            STAR, STAR_ASSIGN, TYPE_EXTENSION_AND"/>
         | 
| 108 | 
            +
                    </module>
         | 
| 109 | 
            +
                </module>
         | 
| 110 | 
            +
            </module>
         | 
| @@ -3,4 +3,4 @@ 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. | 
| 6 | 
            +
            distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
         | 
| @@ -33,7 +33,9 @@ import org.embulk.spi.SchemaConfig; | |
| 33 33 | 
             
            import org.embulk.spi.type.Types;
         | 
| 34 34 | 
             
            import org.msgpack.value.Value;
         | 
| 35 35 | 
             
            import org.slf4j.Logger;
         | 
| 36 | 
            +
             | 
| 36 37 | 
             
            import javax.validation.constraints.Min;
         | 
| 38 | 
            +
             | 
| 37 39 | 
             
            import java.net.UnknownHostException;
         | 
| 38 40 | 
             
            import java.util.List;
         | 
| 39 41 |  | 
| @@ -66,6 +68,10 @@ public class MongodbInputPlugin | |
| 66 68 | 
             
                    @ConfigDefault("\"{}\"")
         | 
| 67 69 | 
             
                    String getSort();
         | 
| 68 70 |  | 
| 71 | 
            +
                    @Config("id_field_name")
         | 
| 72 | 
            +
                    @ConfigDefault("\"_id\"")
         | 
| 73 | 
            +
                    String getIdFieldName();
         | 
| 74 | 
            +
             | 
| 69 75 | 
             
                    @Config("batch_size")
         | 
| 70 76 | 
             
                    @ConfigDefault("10000")
         | 
| 71 77 | 
             
                    @Min(1)
         | 
| @@ -101,7 +107,8 @@ public class MongodbInputPlugin | |
| 101 107 | 
             
                    // Connect once to throw ConfigException in earlier stage of excecution
         | 
| 102 108 | 
             
                    try {
         | 
| 103 109 | 
             
                        connect(task);
         | 
| 104 | 
            -
                    } | 
| 110 | 
            +
                    }
         | 
| 111 | 
            +
                    catch (UnknownHostException | MongoException ex) {
         | 
| 105 112 | 
             
                        throw new ConfigException(ex);
         | 
| 106 113 | 
             
                    }
         | 
| 107 114 | 
             
                    Schema schema = Schema.builder().add(task.getJsonColumnName(), Types.JSON).build();
         | 
| @@ -141,11 +148,12 @@ public class MongodbInputPlugin | |
| 141 148 |  | 
| 142 149 | 
             
                        CodecRegistry registry = CodecRegistries.fromRegistries(
         | 
| 143 150 | 
             
                                MongoClient.getDefaultCodecRegistry(),
         | 
| 144 | 
            -
                                CodecRegistries.fromCodecs(new ValueCodec(task.getStopOnInvalidRecord()))
         | 
| 151 | 
            +
                                CodecRegistries.fromCodecs(new ValueCodec(task.getStopOnInvalidRecord(), task))
         | 
| 145 152 | 
             
                        );
         | 
| 146 153 | 
             
                        collection = db.getCollection(task.getCollection(), Value.class)
         | 
| 147 154 | 
             
                                .withCodecRegistry(registry);
         | 
| 148 | 
            -
                    } | 
| 155 | 
            +
                    }
         | 
| 156 | 
            +
                    catch (UnknownHostException | MongoException ex) {
         | 
| 149 157 | 
             
                        throw new ConfigException(ex);
         | 
| 150 158 | 
             
                    }
         | 
| 151 159 |  | 
| @@ -182,7 +190,8 @@ public class MongodbInputPlugin | |
| 182 190 | 
             
                    return Exec.newConfigDiff();
         | 
| 183 191 | 
             
                }
         | 
| 184 192 |  | 
| 185 | 
            -
                private MongoDatabase connect(final PluginTask task) throws UnknownHostException, MongoException | 
| 193 | 
            +
                private MongoDatabase connect(final PluginTask task) throws UnknownHostException, MongoException
         | 
| 194 | 
            +
                {
         | 
| 186 195 | 
             
                    MongoClientURI uri = new MongoClientURI(task.getUri());
         | 
| 187 196 | 
             
                    MongoClient mongoClient = new MongoClient(uri);
         | 
| 188 197 |  | 
| @@ -192,10 +201,12 @@ public class MongodbInputPlugin | |
| 192 201 | 
             
                    return db;
         | 
| 193 202 | 
             
                }
         | 
| 194 203 |  | 
| 195 | 
            -
                private void validateJsonField(String name, String jsonString) | 
| 204 | 
            +
                private void validateJsonField(String name, String jsonString)
         | 
| 205 | 
            +
                {
         | 
| 196 206 | 
             
                    try {
         | 
| 197 207 | 
             
                        JSON.parse(jsonString);
         | 
| 198 | 
            -
                    } | 
| 208 | 
            +
                    }
         | 
| 209 | 
            +
                    catch (JSONParseException ex) {
         | 
| 199 210 | 
             
                        throw new ConfigException(String.format("Invalid JSON string was given for '%s' parameter. [%s]", name, jsonString));
         | 
| 200 211 | 
             
                    }
         | 
| 201 212 | 
             
                }
         | 
| @@ -11,15 +11,6 @@ import org.embulk.spi.Exec; | |
| 11 11 | 
             
            import org.msgpack.value.Value;
         | 
| 12 12 | 
             
            import org.slf4j.Logger;
         | 
| 13 13 |  | 
| 14 | 
            -
            import static org.msgpack.value.ValueFactory.newArray;
         | 
| 15 | 
            -
            import static org.msgpack.value.ValueFactory.newBinary;
         | 
| 16 | 
            -
            import static org.msgpack.value.ValueFactory.newBoolean;
         | 
| 17 | 
            -
            import static org.msgpack.value.ValueFactory.newFloat;
         | 
| 18 | 
            -
            import static org.msgpack.value.ValueFactory.newInteger;
         | 
| 19 | 
            -
            import static org.msgpack.value.ValueFactory.newMap;
         | 
| 20 | 
            -
            import static org.msgpack.value.ValueFactory.newNil;
         | 
| 21 | 
            -
            import static org.msgpack.value.ValueFactory.newString;
         | 
| 22 | 
            -
             | 
| 23 14 | 
             
            import java.text.SimpleDateFormat;
         | 
| 24 15 | 
             
            import java.util.ArrayList;
         | 
| 25 16 | 
             
            import java.util.Date;
         | 
| @@ -28,39 +19,44 @@ import java.util.List; | |
| 28 19 | 
             
            import java.util.Map;
         | 
| 29 20 | 
             
            import java.util.TimeZone;
         | 
| 30 21 |  | 
| 31 | 
            -
             | 
| 22 | 
            +
            import static org.msgpack.value.ValueFactory.*;
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            public class ValueCodec implements Codec<Value>
         | 
| 25 | 
            +
            {
         | 
| 32 26 | 
             
                private final SimpleDateFormat formatter;
         | 
| 33 27 | 
             
                private final Logger log = Exec.getLogger(MongodbInputPlugin.class);
         | 
| 34 28 | 
             
                private final boolean stopOnInvalidRecord;
         | 
| 29 | 
            +
                private final MongodbInputPlugin.PluginTask task;
         | 
| 35 30 |  | 
| 36 | 
            -
                public ValueCodec(boolean stopOnInvalidRecord) | 
| 31 | 
            +
                public ValueCodec(boolean stopOnInvalidRecord, MongodbInputPlugin.PluginTask task)
         | 
| 32 | 
            +
                {
         | 
| 37 33 | 
             
                    this.formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", java.util.Locale.ENGLISH);
         | 
| 38 34 | 
             
                    formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
         | 
| 39 35 | 
             
                    this.stopOnInvalidRecord = stopOnInvalidRecord;
         | 
| 36 | 
            +
                    this.task = task;
         | 
| 40 37 | 
             
                }
         | 
| 41 38 |  | 
| 42 39 | 
             
                @Override
         | 
| 43 | 
            -
                public void encode(final BsonWriter writer, final Value value, final EncoderContext encoderContext) | 
| 40 | 
            +
                public void encode(final BsonWriter writer, final Value value, final EncoderContext encoderContext)
         | 
| 41 | 
            +
                {
         | 
| 44 42 | 
             
                    throw new UnsupportedOperationException();
         | 
| 45 43 | 
             
                }
         | 
| 46 44 |  | 
| 47 45 | 
             
                @Override
         | 
| 48 | 
            -
                public Value decode(final BsonReader reader, final DecoderContext decoderContext) | 
| 46 | 
            +
                public Value decode(final BsonReader reader, final DecoderContext decoderContext)
         | 
| 47 | 
            +
                {
         | 
| 49 48 | 
             
                    Map<Value, Value> kvs = new LinkedHashMap<>();
         | 
| 50 49 |  | 
| 51 50 | 
             
                    reader.readStartDocument();
         | 
| 52 | 
            -
                    boolean isTopLevelNode = false;
         | 
| 53 51 | 
             
                    while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) {
         | 
| 54 52 | 
             
                        String fieldName = reader.readName();
         | 
| 55 53 | 
             
                        BsonType type = reader.getCurrentBsonType();
         | 
| 56 | 
            -
                         | 
| 57 | 
            -
                            isTopLevelNode = true;
         | 
| 58 | 
            -
                        }
         | 
| 59 | 
            -
                        fieldName = normalize(fieldName, isTopLevelNode);
         | 
| 54 | 
            +
                        fieldName = normalize(fieldName);
         | 
| 60 55 |  | 
| 61 56 | 
             
                        try {
         | 
| 62 57 | 
             
                            kvs.put(newString(fieldName), readValue(reader, decoderContext));
         | 
| 63 | 
            -
                        } | 
| 58 | 
            +
                        }
         | 
| 59 | 
            +
                        catch (UnknownTypeFoundException ex) {
         | 
| 64 60 | 
             
                            reader.skipValue();
         | 
| 65 61 | 
             
                            if (stopOnInvalidRecord) {
         | 
| 66 62 | 
             
                                throw ex;
         | 
| @@ -74,7 +70,8 @@ public class ValueCodec implements Codec<Value> { | |
| 74 70 | 
             
                    return newMap(kvs);
         | 
| 75 71 | 
             
                }
         | 
| 76 72 |  | 
| 77 | 
            -
                public Value decodeArray(final BsonReader reader, final DecoderContext decoderContext) | 
| 73 | 
            +
                public Value decodeArray(final BsonReader reader, final DecoderContext decoderContext)
         | 
| 74 | 
            +
                {
         | 
| 78 75 | 
             
                    List<Value> list = new ArrayList<>();
         | 
| 79 76 |  | 
| 80 77 | 
             
                    reader.readStartArray();
         | 
| @@ -86,7 +83,8 @@ public class ValueCodec implements Codec<Value> { | |
| 86 83 | 
             
                    return newArray(list);
         | 
| 87 84 | 
             
                }
         | 
| 88 85 |  | 
| 89 | 
            -
                private Value readValue(BsonReader reader, DecoderContext decoderContext) | 
| 86 | 
            +
                private Value readValue(BsonReader reader, DecoderContext decoderContext)
         | 
| 87 | 
            +
                {
         | 
| 90 88 | 
             
                    switch (reader.getCurrentBsonType()) {
         | 
| 91 89 | 
             
                        // https://docs.mongodb.com/manual/reference/bson-types/
         | 
| 92 90 | 
             
                        // https://github.com/mongodb/mongo-java-driver/tree/master/bson/src/main/org/bson/codecs
         | 
| @@ -128,15 +126,15 @@ public class ValueCodec implements Codec<Value> { | |
| 128 126 | 
             
                }
         | 
| 129 127 |  | 
| 130 128 | 
             
                @Override
         | 
| 131 | 
            -
                public Class<Value> getEncoderClass() | 
| 129 | 
            +
                public Class<Value> getEncoderClass()
         | 
| 130 | 
            +
                {
         | 
| 132 131 | 
             
                    return Value.class;
         | 
| 133 132 | 
             
                }
         | 
| 134 133 |  | 
| 135 | 
            -
                private String normalize(String key | 
| 136 | 
            -
             | 
| 137 | 
            -
                     | 
| 138 | 
            -
             | 
| 139 | 
            -
                        return "_id";
         | 
| 134 | 
            +
                private String normalize(String key)
         | 
| 135 | 
            +
                {
         | 
| 136 | 
            +
                    if (key.equals("_id")) {
         | 
| 137 | 
            +
                        return task.getIdFieldName();
         | 
| 140 138 | 
             
                    }
         | 
| 141 139 | 
             
                    return key;
         | 
| 142 140 | 
             
                }
         | 
| @@ -34,17 +34,20 @@ import org.junit.rules.ExpectedException; | |
| 34 34 |  | 
| 35 35 | 
             
            import java.lang.reflect.InvocationTargetException;
         | 
| 36 36 | 
             
            import java.lang.reflect.Method;
         | 
| 37 | 
            +
            import java.text.DateFormat;
         | 
| 37 38 | 
             
            import java.text.SimpleDateFormat;
         | 
| 38 39 | 
             
            import java.util.ArrayList;
         | 
| 39 40 | 
             
            import java.util.Arrays;
         | 
| 40 41 | 
             
            import java.util.List;
         | 
| 41 42 | 
             
            import java.util.Locale;
         | 
| 43 | 
            +
            import java.util.TimeZone;
         | 
| 42 44 |  | 
| 43 45 | 
             
            import static org.hamcrest.CoreMatchers.is;
         | 
| 44 46 | 
             
            import static org.junit.Assert.assertEquals;
         | 
| 45 47 | 
             
            import static org.junit.Assert.assertThat;
         | 
| 46 48 |  | 
| 47 | 
            -
            public class TestMongodbInputPlugin | 
| 49 | 
            +
            public class TestMongodbInputPlugin
         | 
| 50 | 
            +
            {
         | 
| 48 51 | 
             
                private static String MONGO_URI;
         | 
| 49 52 | 
             
                private static String MONGO_COLLECTION;
         | 
| 50 53 |  | 
| @@ -64,20 +67,23 @@ public class TestMongodbInputPlugin { | |
| 64 67 | 
             
                 *   MONGO_COLLECTION
         | 
| 65 68 | 
             
                 */
         | 
| 66 69 | 
             
                @BeforeClass
         | 
| 67 | 
            -
                public static void initializeConstant() | 
| 70 | 
            +
                public static void initializeConstant()
         | 
| 71 | 
            +
                {
         | 
| 68 72 | 
             
                    MONGO_URI = System.getenv("MONGO_URI");
         | 
| 69 73 | 
             
                    MONGO_COLLECTION = System.getenv("MONGO_COLLECTION");
         | 
| 70 74 | 
             
                }
         | 
| 71 75 |  | 
| 72 76 | 
             
                @Before
         | 
| 73 | 
            -
                public void createResources() throws Exception | 
| 77 | 
            +
                public void createResources() throws Exception
         | 
| 78 | 
            +
                {
         | 
| 74 79 | 
             
                    config = config();
         | 
| 75 80 | 
             
                    plugin = new MongodbInputPlugin();
         | 
| 76 81 | 
             
                    output = new MockPageOutput();
         | 
| 77 82 | 
             
                }
         | 
| 78 83 |  | 
| 79 84 | 
             
                @Test
         | 
| 80 | 
            -
                public void checkDefaultValues() | 
| 85 | 
            +
                public void checkDefaultValues()
         | 
| 86 | 
            +
                {
         | 
| 81 87 | 
             
                    ConfigSource config = Exec.newConfigSource()
         | 
| 82 88 | 
             
                            .set("uri", MONGO_URI)
         | 
| 83 89 | 
             
                            .set("collection", MONGO_COLLECTION);
         | 
| @@ -90,7 +96,8 @@ public class TestMongodbInputPlugin { | |
| 90 96 | 
             
                }
         | 
| 91 97 |  | 
| 92 98 | 
             
                @Test(expected = ConfigException.class)
         | 
| 93 | 
            -
                public void checkDefaultValuesUriIsNull() | 
| 99 | 
            +
                public void checkDefaultValuesUriIsNull()
         | 
| 100 | 
            +
                {
         | 
| 94 101 | 
             
                    ConfigSource config = Exec.newConfigSource()
         | 
| 95 102 | 
             
                            .set("uri", null)
         | 
| 96 103 | 
             
                            .set("collection", MONGO_COLLECTION);
         | 
| @@ -109,7 +116,8 @@ public class TestMongodbInputPlugin { | |
| 109 116 | 
             
                }
         | 
| 110 117 |  | 
| 111 118 | 
             
                @Test(expected = ConfigException.class)
         | 
| 112 | 
            -
                public void checkDefaultValuesCollectionIsNull() | 
| 119 | 
            +
                public void checkDefaultValuesCollectionIsNull()
         | 
| 120 | 
            +
                {
         | 
| 113 121 | 
             
                    ConfigSource config = Exec.newConfigSource()
         | 
| 114 122 | 
             
                            .set("uri", MONGO_URI)
         | 
| 115 123 | 
             
                            .set("collection", null);
         | 
| @@ -118,12 +126,14 @@ public class TestMongodbInputPlugin { | |
| 118 126 | 
             
                }
         | 
| 119 127 |  | 
| 120 128 | 
             
                @Test
         | 
| 121 | 
            -
                public void testResume() | 
| 129 | 
            +
                public void testResume()
         | 
| 130 | 
            +
                {
         | 
| 122 131 | 
             
                    PluginTask task = config.loadConfig(PluginTask.class);
         | 
| 123 132 | 
             
                    final Schema schema = getFieldSchema();
         | 
| 124 133 | 
             
                    plugin.resume(task.dump(), schema, 0, new InputPlugin.Control() {
         | 
| 125 134 | 
             
                        @Override
         | 
| 126 | 
            -
                        public List<TaskReport> run(TaskSource taskSource, Schema schema, int taskCount) | 
| 135 | 
            +
                        public List<TaskReport> run(TaskSource taskSource, Schema schema, int taskCount)
         | 
| 136 | 
            +
                        {
         | 
| 127 137 | 
             
                            return emptyTaskReports(taskCount);
         | 
| 128 138 | 
             
                        }
         | 
| 129 139 | 
             
                    });
         | 
| @@ -131,19 +141,22 @@ public class TestMongodbInputPlugin { | |
| 131 141 | 
             
                }
         | 
| 132 142 |  | 
| 133 143 | 
             
                @Test
         | 
| 134 | 
            -
                public void testCleanup() | 
| 144 | 
            +
                public void testCleanup()
         | 
| 145 | 
            +
                {
         | 
| 135 146 | 
             
                    PluginTask task = config.loadConfig(PluginTask.class);
         | 
| 136 147 | 
             
                    Schema schema = getFieldSchema();
         | 
| 137 148 | 
             
                    plugin.cleanup(task.dump(), schema, 0, Lists.<TaskReport>newArrayList()); // no errors happens
         | 
| 138 149 | 
             
                }
         | 
| 139 150 |  | 
| 140 151 | 
             
                @Test
         | 
| 141 | 
            -
                public void testGuess() | 
| 152 | 
            +
                public void testGuess()
         | 
| 153 | 
            +
                {
         | 
| 142 154 | 
             
                    plugin.guess(config); // no errors happens
         | 
| 143 155 | 
             
                }
         | 
| 144 156 |  | 
| 145 157 | 
             
                @Test
         | 
| 146 | 
            -
                public void testRun() throws Exception | 
| 158 | 
            +
                public void testRun() throws Exception
         | 
| 159 | 
            +
                {
         | 
| 147 160 | 
             
                    PluginTask task = config.loadConfig(PluginTask.class);
         | 
| 148 161 |  | 
| 149 162 | 
             
                    dropCollection(task, MONGO_COLLECTION);
         | 
| @@ -155,7 +168,8 @@ public class TestMongodbInputPlugin { | |
| 155 168 | 
             
                }
         | 
| 156 169 |  | 
| 157 170 | 
             
                @Test(expected = ValueCodec.UnknownTypeFoundException.class)
         | 
| 158 | 
            -
                public void testRunWithUnsupportedType() throws Exception | 
| 171 | 
            +
                public void testRunWithUnsupportedType() throws Exception
         | 
| 172 | 
            +
                {
         | 
| 159 173 | 
             
                    ConfigSource config = Exec.newConfigSource()
         | 
| 160 174 | 
             
                            .set("uri", MONGO_URI)
         | 
| 161 175 | 
             
                            .set("collection", MONGO_COLLECTION)
         | 
| @@ -176,33 +190,47 @@ public class TestMongodbInputPlugin { | |
| 176 190 | 
             
                }
         | 
| 177 191 |  | 
| 178 192 | 
             
                @Test
         | 
| 179 | 
            -
                public void testNormalize() throws Exception | 
| 180 | 
            -
             | 
| 193 | 
            +
                public void testNormalize() throws Exception
         | 
| 194 | 
            +
                {
         | 
| 195 | 
            +
                    PluginTask task = config.loadConfig(PluginTask.class);
         | 
| 196 | 
            +
                    ValueCodec codec = new ValueCodec(true, task);
         | 
| 181 197 |  | 
| 182 | 
            -
                    Method normalize = ValueCodec.class.getDeclaredMethod("normalize", String.class | 
| 198 | 
            +
                    Method normalize = ValueCodec.class.getDeclaredMethod("normalize", String.class);
         | 
| 183 199 | 
             
                    normalize.setAccessible(true);
         | 
| 184 | 
            -
                    assertEquals("_id", normalize.invoke(codec, " | 
| 185 | 
            -
                    assertEquals(" | 
| 186 | 
            -
             | 
| 200 | 
            +
                    assertEquals("_id", normalize.invoke(codec, "_id").toString());
         | 
| 201 | 
            +
                    assertEquals("f1", normalize.invoke(codec, "f1").toString());
         | 
| 202 | 
            +
                }
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                @Test
         | 
| 205 | 
            +
                public void testNormlizeWithIdFieldName() throws Exception
         | 
| 206 | 
            +
                {
         | 
| 207 | 
            +
                    ConfigSource config = config().set("id_field_name", "object_id");
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                    PluginTask task = config.loadConfig(PluginTask.class);
         | 
| 210 | 
            +
                    ValueCodec codec = new ValueCodec(true, task);
         | 
| 187 211 |  | 
| 188 | 
            -
                     | 
| 189 | 
            -
                     | 
| 190 | 
            -
                    assertEquals(" | 
| 212 | 
            +
                    Method normalize = ValueCodec.class.getDeclaredMethod("normalize", String.class);
         | 
| 213 | 
            +
                    normalize.setAccessible(true);
         | 
| 214 | 
            +
                    assertEquals("object_id", normalize.invoke(codec, "_id").toString());
         | 
| 215 | 
            +
                    assertEquals("f1", normalize.invoke(codec, "f1").toString());
         | 
| 191 216 | 
             
                }
         | 
| 192 217 |  | 
| 193 218 | 
             
                @Test
         | 
| 194 | 
            -
                public void testValidateJsonField() throws Exception | 
| 219 | 
            +
                public void testValidateJsonField() throws Exception
         | 
| 220 | 
            +
                {
         | 
| 195 221 | 
             
                    Method validate = MongodbInputPlugin.class.getDeclaredMethod("validateJsonField", String.class, String.class);
         | 
| 196 222 | 
             
                    validate.setAccessible(true);
         | 
| 197 223 | 
             
                    String invalidJsonString = "{\"name\": invalid}";
         | 
| 198 224 | 
             
                    try {
         | 
| 199 225 | 
             
                        validate.invoke(plugin, "name", invalidJsonString);
         | 
| 200 | 
            -
                    } | 
| 226 | 
            +
                    }
         | 
| 227 | 
            +
                    catch (InvocationTargetException ex) {
         | 
| 201 228 | 
             
                        assertEquals(ConfigException.class, ex.getCause().getClass());
         | 
| 202 229 | 
             
                    }
         | 
| 203 230 | 
             
                }
         | 
| 204 231 |  | 
| 205 | 
            -
                static List<TaskReport> emptyTaskReports(int taskCount) | 
| 232 | 
            +
                static List<TaskReport> emptyTaskReports(int taskCount)
         | 
| 233 | 
            +
                {
         | 
| 206 234 | 
             
                    ImmutableList.Builder<TaskReport> reports = new ImmutableList.Builder<>();
         | 
| 207 235 | 
             
                    for (int i = 0; i < taskCount; i++) {
         | 
| 208 236 | 
             
                        reports.add(Exec.newTaskReport());
         | 
| @@ -211,9 +239,11 @@ public class TestMongodbInputPlugin { | |
| 211 239 | 
             
                }
         | 
| 212 240 |  | 
| 213 241 | 
             
                private class Control
         | 
| 214 | 
            -
                        implements InputPlugin.Control | 
| 242 | 
            +
                        implements InputPlugin.Control
         | 
| 243 | 
            +
                {
         | 
| 215 244 | 
             
                    @Override
         | 
| 216 | 
            -
                    public List<TaskReport> run(TaskSource taskSource, Schema schema, int taskCount) | 
| 245 | 
            +
                    public List<TaskReport> run(TaskSource taskSource, Schema schema, int taskCount)
         | 
| 246 | 
            +
                    {
         | 
| 217 247 | 
             
                        List<TaskReport> reports = new ArrayList<>();
         | 
| 218 248 | 
             
                        for (int i = 0; i < taskCount; i++) {
         | 
| 219 249 | 
             
                            reports.add(plugin.run(taskSource, schema, i, output));
         | 
| @@ -222,24 +252,25 @@ public class TestMongodbInputPlugin { | |
| 222 252 | 
             
                    }
         | 
| 223 253 | 
             
                }
         | 
| 224 254 |  | 
| 225 | 
            -
                private ConfigSource config() | 
| 255 | 
            +
                private ConfigSource config()
         | 
| 256 | 
            +
                {
         | 
| 226 257 | 
             
                    return Exec.newConfigSource()
         | 
| 227 258 | 
             
                            .set("uri", MONGO_URI)
         | 
| 228 | 
            -
                            .set("collection", MONGO_COLLECTION)
         | 
| 229 | 
            -
                            .set("last_path", "");
         | 
| 259 | 
            +
                            .set("collection", MONGO_COLLECTION);
         | 
| 230 260 | 
             
                }
         | 
| 231 261 |  | 
| 232 | 
            -
                private List<Document> createValidDocuments() throws Exception | 
| 233 | 
            -
             | 
| 262 | 
            +
                private List<Document> createValidDocuments() throws Exception
         | 
| 263 | 
            +
                {
         | 
| 264 | 
            +
                    DateFormat format = getUTCDateFormat();
         | 
| 234 265 |  | 
| 235 266 | 
             
                    List<Document> documents = new ArrayList<>();
         | 
| 236 267 | 
             
                    documents.add(
         | 
| 237 268 | 
             
                        new Document("double_field", 1.23)
         | 
| 238 269 | 
             
                                .append("string_field", "embulk")
         | 
| 239 | 
            -
                                .append("array_field", Arrays.asList(1,2,3))
         | 
| 270 | 
            +
                                .append("array_field", Arrays.asList(1, 2, 3))
         | 
| 240 271 | 
             
                                .append("binary_field", new BsonBinary(("test").getBytes("UTF-8")))
         | 
| 241 272 | 
             
                                .append("boolean_field", true)
         | 
| 242 | 
            -
                                .append("datetime_field", format.parse("2015-01- | 
| 273 | 
            +
                                .append("datetime_field", format.parse("2015-01-27T10:23:49.000Z"))
         | 
| 243 274 | 
             
                                .append("null_field", null)
         | 
| 244 275 | 
             
                                .append("regex_field", new BsonRegularExpression(".+?"))
         | 
| 245 276 | 
             
                                .append("javascript_field", new BsonJavaScript("var s = \"javascript\";"))
         | 
| @@ -258,22 +289,25 @@ public class TestMongodbInputPlugin { | |
| 258 289 |  | 
| 259 290 | 
             
                    documents.add(new Document("document_field", new Document("k", "v")));
         | 
| 260 291 |  | 
| 261 | 
            -
                    documents.add(new Document("document_field", new Document("k", format.parse("2015-02- | 
| 292 | 
            +
                    documents.add(new Document("document_field", new Document("k", format.parse("2015-02-02T23:13:45.000Z"))));
         | 
| 262 293 |  | 
| 263 294 | 
             
                    return documents;
         | 
| 264 295 | 
             
                }
         | 
| 265 296 |  | 
| 266 | 
            -
                private Schema getFieldSchema() | 
| 297 | 
            +
                private Schema getFieldSchema()
         | 
| 298 | 
            +
                {
         | 
| 267 299 | 
             
                    ImmutableList.Builder<Column> columns = ImmutableList.builder();
         | 
| 268 300 | 
             
                    columns.add(new Column(0, "record", Types.JSON));
         | 
| 269 301 | 
             
                    return new Schema(columns.build());
         | 
| 270 302 | 
             
                }
         | 
| 271 303 |  | 
| 272 | 
            -
                private void assertValidRecords(Schema schema, MockPageOutput output) throws Exception | 
| 304 | 
            +
                private void assertValidRecords(Schema schema, MockPageOutput output) throws Exception
         | 
| 305 | 
            +
                {
         | 
| 273 306 | 
             
                    List<Object[]> records = Pages.toObjects(schema, output.pages);
         | 
| 274 307 | 
             
                    assertEquals(5, records.size());
         | 
| 275 308 |  | 
| 276 309 | 
             
                    ObjectMapper mapper = new ObjectMapper();
         | 
| 310 | 
            +
                    mapper.setDateFormat(getUTCDateFormat());
         | 
| 277 311 |  | 
| 278 312 | 
             
                    {
         | 
| 279 313 | 
             
                        JsonNode node = mapper.readTree(records.get(0)[0].toString());
         | 
| @@ -314,14 +348,16 @@ public class TestMongodbInputPlugin { | |
| 314 348 | 
             
                    }
         | 
| 315 349 | 
             
                }
         | 
| 316 350 |  | 
| 317 | 
            -
                private void createCollection(PluginTask task, String collectionName) throws Exception | 
| 351 | 
            +
                private void createCollection(PluginTask task, String collectionName) throws Exception
         | 
| 352 | 
            +
                {
         | 
| 318 353 | 
             
                    Method method = MongodbInputPlugin.class.getDeclaredMethod("connect", PluginTask.class);
         | 
| 319 354 | 
             
                    method.setAccessible(true);
         | 
| 320 355 | 
             
                    MongoDatabase db = (MongoDatabase) method.invoke(plugin, task);
         | 
| 321 356 | 
             
                    db.createCollection(collectionName);
         | 
| 322 357 | 
             
                }
         | 
| 323 358 |  | 
| 324 | 
            -
                private void dropCollection(PluginTask task, String collectionName) throws Exception | 
| 359 | 
            +
                private void dropCollection(PluginTask task, String collectionName) throws Exception
         | 
| 360 | 
            +
                {
         | 
| 325 361 | 
             
                    Method method = MongodbInputPlugin.class.getDeclaredMethod("connect", PluginTask.class);
         | 
| 326 362 | 
             
                    method.setAccessible(true);
         | 
| 327 363 | 
             
                    MongoDatabase db = (MongoDatabase) method.invoke(plugin, task);
         | 
| @@ -329,11 +365,18 @@ public class TestMongodbInputPlugin { | |
| 329 365 | 
             
                    collection.drop();
         | 
| 330 366 | 
             
                }
         | 
| 331 367 |  | 
| 332 | 
            -
                private void insertDocument(PluginTask task, List<Document> documents) throws Exception | 
| 368 | 
            +
                private void insertDocument(PluginTask task, List<Document> documents) throws Exception
         | 
| 369 | 
            +
                {
         | 
| 333 370 | 
             
                    Method method = MongodbInputPlugin.class.getDeclaredMethod("connect", PluginTask.class);
         | 
| 334 371 | 
             
                    method.setAccessible(true);
         | 
| 335 372 | 
             
                    MongoDatabase db = (MongoDatabase) method.invoke(plugin, task);
         | 
| 336 373 | 
             
                    MongoCollection collection = db.getCollection(task.getCollection());
         | 
| 337 374 | 
             
                    collection.insertMany(documents);
         | 
| 338 375 | 
             
                }
         | 
| 376 | 
            +
             | 
| 377 | 
            +
                private DateFormat getUTCDateFormat() {
         | 
| 378 | 
            +
                  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", java.util.Locale.ENGLISH);
         | 
| 379 | 
            +
                  dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
         | 
| 380 | 
            +
                  return dateFormat;
         | 
| 381 | 
            +
                }
         | 
| 339 382 | 
             
            }
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            in:
         | 
| 2 | 
            +
              type: mongodb
         | 
| 3 | 
            +
              uri: mongodb://localhost:27017/my_database
         | 
| 4 | 
            +
              collection: "my_collection"
         | 
| 5 | 
            +
              json_column_name: "json"
         | 
| 6 | 
            +
              query: '{ rank: { $gte: 3 } }'
         | 
| 7 | 
            +
              sort: '{ rank: -1 }'
         | 
| 8 | 
            +
              id_field_name: "object_id"
         | 
| 9 | 
            +
              batch_size: 100
         | 
| 10 | 
            +
            out:
         | 
| 11 | 
            +
              type: file
         | 
| 12 | 
            +
              path_prefix: ./tmp/id_field_name
         | 
| 13 | 
            +
              file_ext: csv
         | 
| 14 | 
            +
              formatter:
         | 
| 15 | 
            +
                type: csv
         | 
| 16 | 
            +
                header_line: true
         | 
| 17 | 
            +
                charset: UTF-8
         | 
| 18 | 
            +
                newline: CRLF
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            json
         | 
| 2 | 
            +
            "{""object_id"":""55eae883689a08361045d652"",""name"":""obj9"",""rank"":9,""value"":9.9,""created_at"":""2015-09-06T10:05:18.786Z"",""embeded"":{""key"":""value9""}}"
         | 
| 3 | 
            +
            "{""object_id"":""55eae883689a08361045d651"",""name"":""obj8"",""rank"":8,""value"":8.8,""created_at"":""2015-09-06T10:05:28.786Z"",""embeded"":{""key"":""value8""}}"
         | 
| 4 | 
            +
            "{""object_id"":""55eae883689a08361045d650"",""name"":""obj7"",""rank"":7,""value"":7.7,""created_at"":""2015-09-06T10:05:38.786Z"",""embeded"":{""key"":""value7""}}"
         | 
| 5 | 
            +
            "{""object_id"":""55eae883689a08361045d64f"",""name"":""obj6"",""rank"":6,""value"":6.6,""created_at"":""2015-09-06T10:05:48.786Z"",""embeded"":{""key"":""value6""}}"
         | 
| 6 | 
            +
            "{""object_id"":""55eae883689a08361045d64e"",""name"":""obj5"",""rank"":5,""value"":5.5,""created_at"":""2015-09-06T10:05:58.786Z"",""embeded"":{""key"":""value5""}}"
         | 
| 7 | 
            +
            "{""object_id"":""55eae883689a08361045d64d"",""name"":""obj4"",""rank"":4,""value"":4.4,""created_at"":""2015-09-06T10:06:08.786Z"",""embeded"":{""key"":{""inner_key"":""value4""}}}"
         | 
| 8 | 
            +
            "{""object_id"":""55eae883689a08361045d64c"",""name"":""obj3"",""rank"":3,""value"":3.3,""created_at"":""2015-09-06T10:06:18.786Z"",""embeded"":{""key"":[""v3-1"",""v3-2""]}}"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: embulk-input-mongodb
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.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-06- | 
| 11 | 
            +
            date: 2016-06-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -50,6 +50,8 @@ files: | |
| 50 50 | 
             
            - LICENSE.txt
         | 
| 51 51 | 
             
            - README.md
         | 
| 52 52 | 
             
            - build.gradle
         | 
| 53 | 
            +
            - config/checkstyle/checkstyle.xml
         | 
| 54 | 
            +
            - config/checkstyle/default.xml
         | 
| 53 55 | 
             
            - gradle/wrapper/gradle-wrapper.jar
         | 
| 54 56 | 
             
            - gradle/wrapper/gradle-wrapper.properties
         | 
| 55 57 | 
             
            - gradlew
         | 
| @@ -62,8 +64,10 @@ files: | |
| 62 64 | 
             
            - src/test/resources/basic_expected.csv
         | 
| 63 65 | 
             
            - src/test/resources/full.yml
         | 
| 64 66 | 
             
            - src/test/resources/full_expected.csv
         | 
| 67 | 
            +
            - src/test/resources/id_field_name.yml
         | 
| 68 | 
            +
            - src/test/resources/id_field_name_expected.csv
         | 
| 65 69 | 
             
            - src/test/resources/my_collection.jsonl
         | 
| 66 | 
            -
            - classpath/embulk-input-mongodb-0.3. | 
| 70 | 
            +
            - classpath/embulk-input-mongodb-0.3.1.jar
         | 
| 67 71 | 
             
            - classpath/mongo-java-driver-3.2.2.jar
         | 
| 68 72 | 
             
            homepage: https://github.com/hakobera/embulk-input-mongodb
         | 
| 69 73 | 
             
            licenses:
         | 
| Binary file |