embulk-input-dynamodb 0.2.0 → 0.3.0
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/.github/workflows/master.yml +34 -0
- data/.github/workflows/test.yml +30 -0
- data/.scalafmt.conf +5 -0
- data/CHANGELOG.md +49 -0
- data/README.md +204 -54
- data/build.gradle +53 -44
- data/example/config-deprecated.yml +20 -0
- data/example/config-query-as-json.yml +18 -0
- data/example/config-query.yml +22 -0
- data/example/config-scan.yml +18 -0
- data/example/prepare_dynamodb_table.sh +67 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +1 -2
- data/gradlew +67 -48
- data/gradlew.bat +20 -10
- data/{test/run_dynamodb_local.sh → run_dynamodb_local.sh} +2 -1
- data/settings.gradle +1 -0
- data/src/main/scala/org/embulk/input/dynamodb/DeprecatedDynamodbInputPlugin.scala +73 -0
- data/src/main/scala/org/embulk/input/dynamodb/DynamodbInputPlugin.scala +76 -25
- data/src/main/scala/org/embulk/input/dynamodb/PluginTask.scala +132 -32
- data/src/main/scala/org/embulk/input/dynamodb/aws/Aws.scala +44 -0
- data/src/main/scala/org/embulk/input/dynamodb/aws/AwsClientConfiguration.scala +37 -0
- data/src/main/scala/org/embulk/input/dynamodb/aws/AwsCredentials.scala +240 -0
- data/src/main/scala/org/embulk/input/dynamodb/aws/AwsDynamodbConfiguration.scala +35 -0
- data/src/main/scala/org/embulk/input/dynamodb/aws/AwsEndpointConfiguration.scala +79 -0
- data/src/main/scala/org/embulk/input/dynamodb/aws/HttpProxy.scala +61 -0
- data/src/main/scala/org/embulk/input/dynamodb/deprecated/AttributeValueHelper.scala +72 -0
- data/src/main/scala/org/embulk/input/dynamodb/{Filter.scala → deprecated/Filter.scala} +3 -3
- data/src/main/scala/org/embulk/input/dynamodb/{FilterConfig.scala → deprecated/FilterConfig.scala} +13 -13
- data/src/main/scala/org/embulk/input/dynamodb/{ope → deprecated/ope}/AbstractOperation.scala +36 -18
- data/src/main/scala/org/embulk/input/dynamodb/{ope → deprecated/ope}/QueryOperation.scala +21 -13
- data/src/main/scala/org/embulk/input/dynamodb/{ope → deprecated/ope}/ScanOperation.scala +20 -13
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbAttributeValue.scala +154 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbAttributeValueEmbulkTypeTransformable.scala +245 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbAttributeValueType.scala +33 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemColumnVisitor.scala +50 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemConsumer.scala +40 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemIterator.scala +19 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemReader.scala +64 -0
- data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemSchema.scala +135 -0
- data/src/main/scala/org/embulk/input/dynamodb/operation/AbstractDynamodbOperation.scala +169 -0
- data/src/main/scala/org/embulk/input/dynamodb/operation/DynamodbOperationProxy.scala +59 -0
- data/src/main/scala/org/embulk/input/dynamodb/operation/DynamodbQueryOperation.scala +72 -0
- data/src/main/scala/org/embulk/input/dynamodb/operation/DynamodbScanOperation.scala +93 -0
- data/src/main/scala/org/embulk/input/dynamodb/operation/EmbulkDynamodbOperation.scala +15 -0
- data/src/main/scala/org/embulk/input/dynamodb/package.scala +4 -9
- data/src/test/scala/org/embulk/input/dynamodb/AttributeValueHelperTest.scala +245 -101
- data/src/test/scala/org/embulk/input/dynamodb/AwsCredentialsTest.scala +150 -97
- data/src/test/scala/org/embulk/input/dynamodb/DynamodbQueryOperationTest.scala +188 -0
- data/src/test/scala/org/embulk/input/dynamodb/DynamodbScanOperationTest.scala +181 -0
- data/src/test/scala/org/embulk/input/dynamodb/testutil/EmbulkTestBase.scala +85 -0
- metadata +73 -49
- data/circle.yml +0 -16
- data/config/checkstyle/checkstyle.xml +0 -128
- data/config/checkstyle/default.xml +0 -108
- data/src/main/scala/org/embulk/input/dynamodb/AttributeValueHelper.scala +0 -41
- data/src/main/scala/org/embulk/input/dynamodb/AwsCredentials.scala +0 -63
- data/src/main/scala/org/embulk/input/dynamodb/DynamoDBClient.scala +0 -23
- data/src/test/resources/yaml/authMethodBasic.yml +0 -21
- data/src/test/resources/yaml/authMethodBasic_Error.yml +0 -19
- data/src/test/resources/yaml/authMethodEnv.yml +0 -19
- data/src/test/resources/yaml/authMethodProfile.yml +0 -20
- data/src/test/resources/yaml/dynamodb-local-query.yml +0 -25
- data/src/test/resources/yaml/dynamodb-local-scan.yml +0 -23
- data/src/test/resources/yaml/notSetAuthMethod.yml +0 -20
- data/src/test/scala/org/embulk/input/dynamodb/ope/QueryOperationTest.scala +0 -83
- data/src/test/scala/org/embulk/input/dynamodb/ope/ScanOperationTest.scala +0 -83
- data/test/create_table.sh +0 -16
- data/test/put_items.sh +0 -25
@@ -1,135 +1,188 @@
|
|
1
1
|
package org.embulk.input.dynamodb
|
2
2
|
|
3
|
-
import
|
4
|
-
import
|
5
|
-
import
|
6
|
-
|
7
|
-
import
|
8
|
-
import org.
|
9
|
-
import org.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
private var EMBULK_DYNAMODB_TEST_SECRET_KEY: String = null
|
21
|
-
private var EMBULK_DYNAMODB_TEST_PROFILE_NAME: String = null
|
22
|
-
|
23
|
-
private var embulk: EmbulkEmbed = null
|
24
|
-
|
25
|
-
@Rule
|
26
|
-
def runtime: EmbulkTestRuntime = new EmbulkTestRuntime
|
27
|
-
|
28
|
-
@Before
|
29
|
-
def createResources() {
|
30
|
-
// Get Environments
|
31
|
-
EMBULK_DYNAMODB_TEST_REGION = System.getenv("EMBULK_DYNAMODB_TEST_REGION")
|
32
|
-
EMBULK_DYNAMODB_TEST_TABLE = System.getenv("EMBULK_DYNAMODB_TEST_TABLE")
|
33
|
-
EMBULK_DYNAMODB_TEST_ACCESS_KEY = System.getenv("EMBULK_DYNAMODB_TEST_ACCESS_KEY")
|
34
|
-
EMBULK_DYNAMODB_TEST_SECRET_KEY = System.getenv("EMBULK_DYNAMODB_TEST_SECRET_KEY")
|
35
|
-
EMBULK_DYNAMODB_TEST_PROFILE_NAME = System.getenv("EMBULK_DYNAMODB_TEST_PROFILE_NAME")
|
36
|
-
|
37
|
-
val bootstrap = new EmbulkEmbed.Bootstrap()
|
38
|
-
bootstrap.addModules(new Module {
|
39
|
-
def configure(binder: Binder): Unit = {
|
40
|
-
InjectedPluginSource.registerPluginTo(binder,
|
41
|
-
classOf[InputPlugin],
|
42
|
-
"dynamodb",
|
43
|
-
classOf[DynamodbInputPlugin])
|
44
|
-
}
|
45
|
-
})
|
46
|
-
|
47
|
-
embulk = bootstrap.initializeCloseable()
|
3
|
+
import com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException
|
4
|
+
import org.embulk.config.{ConfigException, ConfigSource}
|
5
|
+
import org.embulk.input.dynamodb.aws.AwsCredentials
|
6
|
+
import org.embulk.input.dynamodb.testutil.EmbulkTestBase
|
7
|
+
import org.hamcrest.CoreMatchers._
|
8
|
+
import org.hamcrest.MatcherAssert.assertThat
|
9
|
+
import org.junit.{Assume, Test}
|
10
|
+
|
11
|
+
class AwsCredentialsTest extends EmbulkTestBase {
|
12
|
+
|
13
|
+
private val runAwsCredentialsTest: Boolean = Option(
|
14
|
+
System.getenv("RUN_AWS_CREDENTIALS_TEST")
|
15
|
+
) match {
|
16
|
+
case Some(x) =>
|
17
|
+
if (x == "false") false
|
18
|
+
else true
|
19
|
+
case None => true
|
48
20
|
}
|
49
21
|
|
50
|
-
|
51
|
-
|
22
|
+
private lazy val EMBULK_DYNAMODB_TEST_ACCESS_KEY =
|
23
|
+
getEnvironmentVariableOrShowErrorMessage("EMBULK_DYNAMODB_TEST_ACCESS_KEY")
|
52
24
|
|
53
|
-
|
54
|
-
|
55
|
-
|
25
|
+
private lazy val EMBULK_DYNAMODB_TEST_SECRET_KEY =
|
26
|
+
getEnvironmentVariableOrShowErrorMessage("EMBULK_DYNAMODB_TEST_SECRET_KEY")
|
27
|
+
|
28
|
+
private lazy val EMBULK_DYNAMODB_TEST_PROFILE_NAME =
|
29
|
+
getEnvironmentVariableOrShowErrorMessage(
|
30
|
+
"EMBULK_DYNAMODB_TEST_PROFILE_NAME"
|
31
|
+
)
|
32
|
+
|
33
|
+
private lazy val EMBULK_DYNAMODB_TEST_ASSUME_ROLE_ROLE_ARN =
|
34
|
+
getEnvironmentVariableOrShowErrorMessage(
|
35
|
+
"EMBULK_DYNAMODB_TEST_ASSUME_ROLE_ROLE_ARN"
|
36
|
+
)
|
37
|
+
|
38
|
+
def doTest(inConfig: ConfigSource): Unit = {
|
39
|
+
val task: PluginTask = inConfig.loadConfig(classOf[PluginTask])
|
40
|
+
val provider = AwsCredentials(task).createAwsCredentialsProvider
|
41
|
+
val cred = provider.getCredentials
|
42
|
+
assertThat(cred.getAWSAccessKeyId, notNullValue())
|
43
|
+
assertThat(cred.getAWSSecretKey, notNullValue())
|
56
44
|
}
|
57
45
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
46
|
+
def defaultInConfig: ConfigSource = {
|
47
|
+
embulk.configLoader().fromYamlString(s"""
|
48
|
+
|type: dynamodb
|
49
|
+
|region: us-east-1
|
50
|
+
|table: hoge
|
51
|
+
|operation: scan
|
52
|
+
|columns:
|
53
|
+
| - {name: key1, type: string}
|
54
|
+
| - {name: key2, type: long}
|
55
|
+
| - {name: value1, type: string}
|
56
|
+
|""".stripMargin)
|
57
|
+
}
|
62
58
|
|
63
|
-
|
64
|
-
|
65
|
-
|
59
|
+
@deprecated(since = "0.3.0")
|
60
|
+
@Test
|
61
|
+
def notSetAuthMethod_SetCredentials_deprecated(): Unit = {
|
62
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
63
|
+
val inConfig: ConfigSource = defaultInConfig
|
66
64
|
.set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
67
65
|
.set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
68
66
|
|
69
|
-
doTest(
|
67
|
+
doTest(inConfig)
|
70
68
|
}
|
71
69
|
|
72
70
|
@Test
|
73
|
-
def
|
74
|
-
|
75
|
-
|
71
|
+
def notSetAuthMethod_SetCredentials(): Unit = {
|
72
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
73
|
+
val inConfig: ConfigSource = defaultInConfig
|
74
|
+
.set("access_key_id", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
75
|
+
.set("secret_access_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
doTest(inConfig)
|
78
|
+
}
|
79
|
+
|
80
|
+
@deprecated(since = "0.3.0")
|
81
|
+
@Test
|
82
|
+
def setAuthMethod_Basic_deprecated(): Unit = {
|
83
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
84
|
+
val inConfig: ConfigSource = defaultInConfig
|
85
|
+
.set("auth_method", "basic")
|
80
86
|
.set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
81
87
|
.set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
82
88
|
|
83
|
-
doTest(
|
89
|
+
doTest(inConfig)
|
84
90
|
}
|
85
91
|
|
86
|
-
@Test
|
87
|
-
def
|
88
|
-
|
89
|
-
|
92
|
+
@Test
|
93
|
+
def setAuthMethod_Basic(): Unit = {
|
94
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
95
|
+
val inConfig: ConfigSource = defaultInConfig
|
96
|
+
.set("auth_method", "basic")
|
97
|
+
.set("access_key_id", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
98
|
+
.set("secret_access_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
99
|
+
|
100
|
+
doTest(inConfig)
|
101
|
+
}
|
90
102
|
|
91
|
-
|
92
|
-
|
93
|
-
|
103
|
+
@deprecated(since = "0.3.0")
|
104
|
+
@Test(expected = classOf[ConfigException])
|
105
|
+
def throwIfSetAccessKeyAndAccessKeyId(): Unit = {
|
106
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
107
|
+
val inConfig: ConfigSource = defaultInConfig
|
108
|
+
.set("auth_method", "basic")
|
109
|
+
.set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
110
|
+
.set("access_key_id", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
111
|
+
.set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
94
112
|
|
95
|
-
doTest(
|
113
|
+
doTest(inConfig)
|
96
114
|
}
|
97
115
|
|
98
|
-
@
|
99
|
-
|
100
|
-
|
101
|
-
|
116
|
+
@deprecated(since = "0.3.0")
|
117
|
+
@Test(expected = classOf[ConfigException])
|
118
|
+
def throwIfSetSecretKeyAndSecretAccessKeyId(): Unit = {
|
119
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
120
|
+
val inConfig: ConfigSource = defaultInConfig
|
121
|
+
.set("auth_method", "basic")
|
122
|
+
.set("access_key", EMBULK_DYNAMODB_TEST_ACCESS_KEY)
|
123
|
+
.set("secret_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
124
|
+
.set("secret_access_key", EMBULK_DYNAMODB_TEST_SECRET_KEY)
|
102
125
|
|
103
|
-
|
104
|
-
|
105
|
-
.set("table", EMBULK_DYNAMODB_TEST_TABLE)
|
126
|
+
doTest(inConfig)
|
127
|
+
}
|
106
128
|
|
107
|
-
|
129
|
+
@Test(expected = classOf[ConfigException])
|
130
|
+
def setAuthMethod_Basic_NotSet(): Unit = {
|
131
|
+
val inConfig: ConfigSource = defaultInConfig
|
132
|
+
.set("auth_method", "basic")
|
133
|
+
|
134
|
+
doTest(inConfig)
|
108
135
|
}
|
109
136
|
|
110
137
|
@Test
|
111
|
-
def
|
112
|
-
|
113
|
-
|
138
|
+
def setAuthMethod_Env(): Unit = {
|
139
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
140
|
+
// NOTE: Requires to set the env vars like 'AWS_ACCESS_KEY_ID' and so on when testing.
|
141
|
+
val inConfig: ConfigSource = defaultInConfig
|
142
|
+
.set("auth_method", "env")
|
143
|
+
|
144
|
+
doTest(inConfig)
|
145
|
+
}
|
114
146
|
|
115
|
-
|
116
|
-
|
117
|
-
|
147
|
+
@Test
|
148
|
+
def setAuthMethod_Profile(): Unit = {
|
149
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
150
|
+
// NOTE: Requires to set credentials to '~/.aws' when testing.
|
151
|
+
val inConfig: ConfigSource = defaultInConfig
|
152
|
+
.set("auth_method", "profile")
|
118
153
|
.set("profile_name", EMBULK_DYNAMODB_TEST_PROFILE_NAME)
|
119
154
|
|
120
|
-
doTest(
|
155
|
+
doTest(inConfig)
|
156
|
+
}
|
157
|
+
|
158
|
+
@Test(expected = classOf[IllegalArgumentException])
|
159
|
+
def setAuthMethod_Profile_NotExistProfileName(): Unit = {
|
160
|
+
val inConfig: ConfigSource = defaultInConfig
|
161
|
+
.set("auth_method", "profile")
|
162
|
+
.set("profile_name", "DO_NOT_EXIST")
|
163
|
+
|
164
|
+
doTest(inConfig)
|
121
165
|
}
|
122
166
|
|
123
|
-
@Test
|
124
|
-
def
|
125
|
-
|
126
|
-
|
167
|
+
@Test
|
168
|
+
def setAuthMethod_assume_role(): Unit = {
|
169
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
170
|
+
val inConfig: ConfigSource = defaultInConfig
|
171
|
+
.set("auth_method", "assume_role")
|
172
|
+
.set("role_arn", EMBULK_DYNAMODB_TEST_ASSUME_ROLE_ROLE_ARN)
|
173
|
+
.set("role_session_name", "dummy")
|
174
|
+
|
175
|
+
doTest(inConfig)
|
176
|
+
}
|
127
177
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
178
|
+
@Test(expected = classOf[AWSSecurityTokenServiceException])
|
179
|
+
def setAuthMethod_assume_role_NotExistRoleArn(): Unit = {
|
180
|
+
Assume.assumeTrue(runAwsCredentialsTest)
|
181
|
+
val inConfig: ConfigSource = defaultInConfig
|
182
|
+
.set("auth_method", "assume_role")
|
183
|
+
.set("role_arn", "DO_NOT_EXIST")
|
184
|
+
.set("role_session_name", "dummy")
|
132
185
|
|
133
|
-
doTest(
|
186
|
+
doTest(inConfig)
|
134
187
|
}
|
135
188
|
}
|
@@ -0,0 +1,188 @@
|
|
1
|
+
package org.embulk.input.dynamodb
|
2
|
+
|
3
|
+
import com.amazonaws.services.dynamodbv2.model.{
|
4
|
+
AttributeDefinition,
|
5
|
+
AttributeValue,
|
6
|
+
CreateTableRequest,
|
7
|
+
KeySchemaElement,
|
8
|
+
KeyType,
|
9
|
+
ProvisionedThroughput,
|
10
|
+
PutItemRequest,
|
11
|
+
ScalarAttributeType
|
12
|
+
}
|
13
|
+
import org.embulk.config.ConfigSource
|
14
|
+
import org.embulk.input.dynamodb.testutil.EmbulkTestBase
|
15
|
+
import org.embulk.spi.util.Pages
|
16
|
+
import org.hamcrest.CoreMatchers._
|
17
|
+
import org.hamcrest.MatcherAssert.assertThat
|
18
|
+
import org.junit.Test
|
19
|
+
import org.msgpack.value.Value
|
20
|
+
|
21
|
+
import scala.jdk.CollectionConverters._
|
22
|
+
|
23
|
+
class DynamodbQueryOperationTest extends EmbulkTestBase {
|
24
|
+
|
25
|
+
private def testBackwardCompatibility(embulkInConfig: ConfigSource): Unit = {
|
26
|
+
cleanupTable("EMBULK_DYNAMODB_TEST_TABLE")
|
27
|
+
withDynamodb { dynamodb =>
|
28
|
+
dynamodb.createTable(
|
29
|
+
new CreateTableRequest()
|
30
|
+
.withTableName("EMBULK_DYNAMODB_TEST_TABLE")
|
31
|
+
.withAttributeDefinitions(
|
32
|
+
new AttributeDefinition()
|
33
|
+
.withAttributeName("pri-key")
|
34
|
+
.withAttributeType(ScalarAttributeType.S),
|
35
|
+
new AttributeDefinition()
|
36
|
+
.withAttributeName("sort-key")
|
37
|
+
.withAttributeType(ScalarAttributeType.N)
|
38
|
+
)
|
39
|
+
.withKeySchema(
|
40
|
+
new KeySchemaElement()
|
41
|
+
.withAttributeName("pri-key")
|
42
|
+
.withKeyType(KeyType.HASH),
|
43
|
+
new KeySchemaElement()
|
44
|
+
.withAttributeName("sort-key")
|
45
|
+
.withKeyType(KeyType.RANGE)
|
46
|
+
)
|
47
|
+
.withProvisionedThroughput(
|
48
|
+
new ProvisionedThroughput()
|
49
|
+
.withReadCapacityUnits(5L)
|
50
|
+
.withWriteCapacityUnits(5L)
|
51
|
+
)
|
52
|
+
)
|
53
|
+
|
54
|
+
dynamodb.putItem(
|
55
|
+
new PutItemRequest()
|
56
|
+
.withTableName("EMBULK_DYNAMODB_TEST_TABLE")
|
57
|
+
.withItem(
|
58
|
+
Map
|
59
|
+
.newBuilder[String, AttributeValue]
|
60
|
+
.addOne("pri-key", new AttributeValue().withS("key-1"))
|
61
|
+
.addOne("sort-key", new AttributeValue().withN("0"))
|
62
|
+
.addOne("doubleValue", new AttributeValue().withN("42.195"))
|
63
|
+
.addOne("boolValue", new AttributeValue().withBOOL(true))
|
64
|
+
.addOne(
|
65
|
+
"listValue",
|
66
|
+
new AttributeValue().withL(
|
67
|
+
new AttributeValue().withS("list-value"),
|
68
|
+
new AttributeValue().withN("123")
|
69
|
+
)
|
70
|
+
)
|
71
|
+
.addOne(
|
72
|
+
"mapValue",
|
73
|
+
new AttributeValue().withM(
|
74
|
+
Map
|
75
|
+
.newBuilder[String, AttributeValue]
|
76
|
+
.addOne(
|
77
|
+
"map-key-1",
|
78
|
+
new AttributeValue().withS("map-value-1")
|
79
|
+
)
|
80
|
+
.addOne("map-key-2", new AttributeValue().withN("456"))
|
81
|
+
.result()
|
82
|
+
.asJava
|
83
|
+
)
|
84
|
+
)
|
85
|
+
.result()
|
86
|
+
.asJava
|
87
|
+
)
|
88
|
+
)
|
89
|
+
|
90
|
+
val path = embulk.createTempFile("csv")
|
91
|
+
val result = embulk
|
92
|
+
.inputBuilder()
|
93
|
+
.in(embulkInConfig)
|
94
|
+
.outputPath(path)
|
95
|
+
.preview()
|
96
|
+
|
97
|
+
val pages = result.getPages
|
98
|
+
val head = Pages.toObjects(result.getSchema, pages.get(0)).get(0)
|
99
|
+
|
100
|
+
assertThat(head(0).toString, is("key-1"))
|
101
|
+
assertThat(head(1).asInstanceOf[Long], is(0L))
|
102
|
+
assertThat(head(2).asInstanceOf[Double], is(42.195))
|
103
|
+
assertThat(head(3).asInstanceOf[Boolean], is(true))
|
104
|
+
|
105
|
+
val arrayValue = head(4).asInstanceOf[Value].asArrayValue()
|
106
|
+
assertThat(arrayValue.size(), is(2))
|
107
|
+
assertThat(arrayValue.get(0).asStringValue().toString, is("list-value"))
|
108
|
+
assertThat(arrayValue.get(1).asIntegerValue().asLong(), is(123L))
|
109
|
+
|
110
|
+
val mapValue = head(5).asInstanceOf[Value].asMapValue()
|
111
|
+
assert(mapValue.keySet().asScala.map(_.toString).contains("map-key-1"))
|
112
|
+
assertThat(
|
113
|
+
mapValue
|
114
|
+
.entrySet()
|
115
|
+
.asScala
|
116
|
+
.filter(_.getKey.toString.equals("map-key-1"))
|
117
|
+
.head
|
118
|
+
.getValue
|
119
|
+
.toString,
|
120
|
+
is("map-value-1")
|
121
|
+
)
|
122
|
+
assert(mapValue.keySet().asScala.map(_.toString).contains("map-key-2"))
|
123
|
+
assertThat(
|
124
|
+
mapValue
|
125
|
+
.entrySet()
|
126
|
+
.asScala
|
127
|
+
.filter(_.getKey.toString.equals("map-key-2"))
|
128
|
+
.head
|
129
|
+
.getValue
|
130
|
+
.asIntegerValue()
|
131
|
+
.asLong(),
|
132
|
+
is(456L)
|
133
|
+
)
|
134
|
+
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
@Test
|
139
|
+
def deprecatedQueryOperationTest(): Unit = {
|
140
|
+
val inConfig: ConfigSource = embulk.configLoader().fromYamlString(s"""
|
141
|
+
|type: dynamodb
|
142
|
+
|end_point: http://${dynamoDBHost}:${dynamoDBPort}/
|
143
|
+
|table: EMBULK_DYNAMODB_TEST_TABLE
|
144
|
+
|auth_method: basic
|
145
|
+
|access_key: dummy
|
146
|
+
|secret_key: dummy
|
147
|
+
|operation: query
|
148
|
+
|filters:
|
149
|
+
| - {name: pri-key, type: string, condition: EQ, value: key-1}
|
150
|
+
|columns:
|
151
|
+
| - {name: pri-key, type: string}
|
152
|
+
| - {name: sort-key, type: long}
|
153
|
+
| - {name: doubleValue, type: double}
|
154
|
+
| - {name: boolValue, type: boolean}
|
155
|
+
| - {name: listValue, type: json}
|
156
|
+
| - {name: mapValue, type: json}
|
157
|
+
|""".stripMargin)
|
158
|
+
|
159
|
+
testBackwardCompatibility(inConfig)
|
160
|
+
}
|
161
|
+
|
162
|
+
@Test
|
163
|
+
def keepTheSameBehaviourAsDeprecatedQueryOperationTest(): Unit = {
|
164
|
+
val inConfig: ConfigSource = embulk.configLoader().fromYamlString(s"""
|
165
|
+
|type: dynamodb
|
166
|
+
|endpoint: http://${dynamoDBHost}:${dynamoDBPort}/
|
167
|
+
|table: EMBULK_DYNAMODB_TEST_TABLE
|
168
|
+
|auth_method: basic
|
169
|
+
|access_key: dummy
|
170
|
+
|secret_key: dummy
|
171
|
+
|query:
|
172
|
+
| key_condition_expression: "#x = :v"
|
173
|
+
| expression_attribute_names:
|
174
|
+
| "#x": pri-key
|
175
|
+
| expression_attribute_values:
|
176
|
+
| ":v": {S: key-1}
|
177
|
+
|columns:
|
178
|
+
| - {name: pri-key, type: string}
|
179
|
+
| - {name: sort-key, type: long}
|
180
|
+
| - {name: doubleValue, type: double}
|
181
|
+
| - {name: boolValue, type: boolean}
|
182
|
+
| - {name: listValue, type: json}
|
183
|
+
| - {name: mapValue, type: json}
|
184
|
+
|""".stripMargin)
|
185
|
+
|
186
|
+
testBackwardCompatibility(inConfig)
|
187
|
+
}
|
188
|
+
}
|