embulk-input-dynamodb 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|