embulk-output-td 0.1.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/README.md +63 -0
  4. data/build.gradle +79 -0
  5. data/embulk-output-td.gemspec +18 -0
  6. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  7. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  8. data/gradlew +164 -0
  9. data/gradlew.bat +90 -0
  10. data/lib/embulk/output/td.rb +3 -0
  11. data/settings.gradle +1 -0
  12. data/src/main/java/com/treasuredata/api/TdApiClient.java +436 -0
  13. data/src/main/java/com/treasuredata/api/TdApiClientConfig.java +79 -0
  14. data/src/main/java/com/treasuredata/api/TdApiConflictException.java +10 -0
  15. data/src/main/java/com/treasuredata/api/TdApiConstants.java +6 -0
  16. data/src/main/java/com/treasuredata/api/TdApiException.java +20 -0
  17. data/src/main/java/com/treasuredata/api/TdApiExecutionException.java +10 -0
  18. data/src/main/java/com/treasuredata/api/TdApiExecutionInterruptedException.java +15 -0
  19. data/src/main/java/com/treasuredata/api/TdApiExecutionTimeoutException.java +17 -0
  20. data/src/main/java/com/treasuredata/api/TdApiNotFoundException.java +10 -0
  21. data/src/main/java/com/treasuredata/api/TdApiResponseException.java +32 -0
  22. data/src/main/java/com/treasuredata/api/model/TDArrayColumnType.java +80 -0
  23. data/src/main/java/com/treasuredata/api/model/TDBulkImportSession.java +155 -0
  24. data/src/main/java/com/treasuredata/api/model/TDColumn.java +83 -0
  25. data/src/main/java/com/treasuredata/api/model/TDColumnType.java +23 -0
  26. data/src/main/java/com/treasuredata/api/model/TDColumnTypeDeserializer.java +115 -0
  27. data/src/main/java/com/treasuredata/api/model/TDDatabase.java +48 -0
  28. data/src/main/java/com/treasuredata/api/model/TDDatabaseList.java +24 -0
  29. data/src/main/java/com/treasuredata/api/model/TDMapColumnType.java +88 -0
  30. data/src/main/java/com/treasuredata/api/model/TDPrimitiveColumnType.java +61 -0
  31. data/src/main/java/com/treasuredata/api/model/TDTable.java +64 -0
  32. data/src/main/java/com/treasuredata/api/model/TDTableList.java +33 -0
  33. data/src/main/java/com/treasuredata/api/model/TDTablePermission.java +48 -0
  34. data/src/main/java/com/treasuredata/api/model/TDTableSchema.java +44 -0
  35. data/src/main/java/com/treasuredata/api/model/TDTableType.java +36 -0
  36. data/src/main/java/org/embulk/output/FinalizableExecutorService.java +84 -0
  37. data/src/main/java/org/embulk/output/MsgpackGZFileBuilder.java +148 -0
  38. data/src/main/java/org/embulk/output/RecordWriter.java +567 -0
  39. data/src/main/java/org/embulk/output/TdOutputPlugin.java +390 -0
  40. data/src/test/java/org/embulk/output/TestTdOutputPlugin.java +5 -0
  41. metadata +119 -0
@@ -0,0 +1,23 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonValue;
4
+ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5
+
6
+ @JsonDeserialize(using = TDColumnTypeDeserializer.class)
7
+ public interface TDColumnType
8
+ {
9
+ public boolean isPrimitive();
10
+
11
+ public boolean isArrayType();
12
+
13
+ public boolean isMapType();
14
+
15
+ public TDPrimitiveColumnType asPrimitiveType();
16
+
17
+ public TDArrayColumnType asArrayType();
18
+
19
+ public TDMapColumnType asMapType();
20
+
21
+ @JsonValue
22
+ public String toString();
23
+ }
@@ -0,0 +1,115 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.fasterxml.jackson.core.JsonParser;
4
+ import com.fasterxml.jackson.core.JsonProcessingException;
5
+ import com.fasterxml.jackson.core.JsonToken;
6
+ import com.fasterxml.jackson.databind.DeserializationContext;
7
+ import com.fasterxml.jackson.databind.JsonDeserializer;
8
+ import com.fasterxml.jackson.databind.RuntimeJsonMappingException;
9
+
10
+ import java.io.IOException;
11
+
12
+ public class TDColumnTypeDeserializer
13
+ extends JsonDeserializer<TDColumnType>
14
+ {
15
+ @Override
16
+ public TDColumnType deserialize(JsonParser jp, DeserializationContext ctxt)
17
+ throws IOException, JsonProcessingException
18
+ {
19
+ if (jp.nextToken() != JsonToken.VALUE_STRING) {
20
+ //throw new JsonMappingException("Unexpected JSON element to deserialize TDColumnType");
21
+ throw new RuntimeJsonMappingException("Unexpected JSON element to deserialize TDColumnType");
22
+ }
23
+ String str = jp.getText();
24
+ return parseColumnType(str);
25
+ }
26
+
27
+ public static TDColumnType parseColumnType(String str)
28
+ {
29
+ Parser p = new Parser(str);
30
+ TDColumnType type = parseColumnTypeRecursive(p);
31
+ if (!p.eof()) {
32
+ throw new IllegalArgumentException("Cannot parse type: EOF expected: " + str);
33
+ }
34
+ return type;
35
+ }
36
+
37
+ private static TDColumnType parseColumnTypeRecursive(Parser p)
38
+ {
39
+ if (p.scan("string")) {
40
+ return TDPrimitiveColumnType.STRING;
41
+
42
+ } else if (p.scan("int")) {
43
+ return TDPrimitiveColumnType.INT;
44
+
45
+ } else if (p.scan("long")) {
46
+ return TDPrimitiveColumnType.LONG;
47
+
48
+ } else if (p.scan("double")) {
49
+ return TDPrimitiveColumnType.DOUBLE;
50
+
51
+ } else if (p.scan("float")) {
52
+ return TDPrimitiveColumnType.FLOAT;
53
+
54
+ } else if (p.scan("array")) {
55
+ if (!p.scan("<")) {
56
+ throw new IllegalArgumentException("Cannot parse type: expected '<' for array type: " + p.getString());
57
+ }
58
+ TDColumnType elementType = parseColumnTypeRecursive(p);
59
+ if (!p.scan(">")) {
60
+ throw new IllegalArgumentException("Cannot parse type: expected '>' for array type: " + p.getString());
61
+ }
62
+ return new TDArrayColumnType(elementType);
63
+
64
+ } else if (p.scan("map")) {
65
+ if (!p.scan("<")) {
66
+ throw new IllegalArgumentException("Cannot parse type: expected '<' for map type: " + p.getString());
67
+ }
68
+ TDColumnType keyType = parseColumnTypeRecursive(p);
69
+ if (!p.scan(",")) {
70
+ throw new IllegalArgumentException("Cannot parse type: expected ',' for map type: " + p.getString());
71
+ }
72
+ TDColumnType valueType = parseColumnTypeRecursive(p);
73
+ if (!p.scan(">")) {
74
+ throw new IllegalArgumentException("Cannot parse type: expected '>' for map type: " + p.getString());
75
+ }
76
+ return new TDMapColumnType(keyType, valueType);
77
+
78
+ } else {
79
+ throw new IllegalArgumentException("Cannot parse type: " + p.getString());
80
+ }
81
+ }
82
+
83
+ private static class Parser {
84
+ private final String string;
85
+ private int offset;
86
+
87
+ public Parser(String string) {
88
+ this.string = string;
89
+ }
90
+
91
+ public String getString() {
92
+ return string;
93
+ }
94
+
95
+ public boolean scan(String s) {
96
+ skipSpaces();
97
+ if (string.startsWith(s, offset)) {
98
+ offset += s.length();
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+
104
+ public boolean eof() {
105
+ skipSpaces();
106
+ return string.length() <= offset;
107
+ }
108
+
109
+ private void skipSpaces() {
110
+ while (string.startsWith(" ", offset)) {
111
+ offset++;
112
+ }
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,48 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonCreator;
4
+ import com.fasterxml.jackson.annotation.JsonProperty;
5
+ import com.google.common.base.Objects;
6
+
7
+ public class TDDatabase
8
+ {
9
+ private String name;
10
+ // "permission" field is also available but not necessary yet
11
+
12
+ @JsonCreator
13
+ public TDDatabase(
14
+ @JsonProperty("name") String name)
15
+ {
16
+ this.name = name;
17
+ }
18
+
19
+ @JsonProperty
20
+ public String getName()
21
+ {
22
+ return name;
23
+ }
24
+
25
+ public boolean isWritable() {
26
+ // TODO not implemented yet
27
+ return true;
28
+ }
29
+
30
+ @Override
31
+ public boolean equals(Object obj)
32
+ {
33
+ if (this == obj) {
34
+ return true;
35
+ }
36
+ if (obj == null || getClass() != obj.getClass()) {
37
+ return false;
38
+ }
39
+ TDDatabase other = (TDDatabase) obj;
40
+ return Objects.equal(this.name, other.name);
41
+ }
42
+
43
+ @Override
44
+ public int hashCode()
45
+ {
46
+ return Objects.hashCode(name);
47
+ }
48
+ }
@@ -0,0 +1,24 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonCreator;
4
+ import com.fasterxml.jackson.annotation.JsonProperty;
5
+
6
+ import java.util.List;
7
+
8
+ public class TDDatabaseList
9
+ {
10
+ private List<TDDatabase> databases;
11
+
12
+ @JsonCreator
13
+ public TDDatabaseList(
14
+ @JsonProperty("databases") List<TDDatabase> databases)
15
+ {
16
+ this.databases = databases;
17
+ }
18
+
19
+ @JsonProperty
20
+ public List<TDDatabase> getDatabases()
21
+ {
22
+ return databases;
23
+ }
24
+ }
@@ -0,0 +1,88 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.google.common.base.Objects;
4
+
5
+ public class TDMapColumnType
6
+ implements TDColumnType
7
+ {
8
+ private TDColumnType keyType;
9
+ private TDColumnType valueType;
10
+
11
+ public TDMapColumnType(TDColumnType keyType, TDColumnType valueType)
12
+ {
13
+ this.keyType = keyType;
14
+ this.valueType = valueType;
15
+ }
16
+
17
+ public TDColumnType getKeyType()
18
+ {
19
+ return keyType;
20
+ }
21
+
22
+ public TDColumnType getValueType()
23
+ {
24
+ return valueType;
25
+ }
26
+
27
+ @Override
28
+ public String toString()
29
+ {
30
+ return "map<"+keyType+","+valueType+">";
31
+ }
32
+
33
+ @Override
34
+ public boolean isPrimitive()
35
+ {
36
+ return false;
37
+ }
38
+
39
+ @Override
40
+ public boolean isArrayType()
41
+ {
42
+ return false;
43
+ }
44
+
45
+ @Override
46
+ public boolean isMapType()
47
+ {
48
+ return true;
49
+ }
50
+
51
+ @Override
52
+ public TDPrimitiveColumnType asPrimitiveType()
53
+ {
54
+ return null;
55
+ }
56
+
57
+ @Override
58
+ public TDArrayColumnType asArrayType()
59
+ {
60
+ return null;
61
+ }
62
+
63
+ @Override
64
+ public TDMapColumnType asMapType()
65
+ {
66
+ return this;
67
+ }
68
+
69
+ @Override
70
+ public boolean equals(Object obj)
71
+ {
72
+ if (this == obj) {
73
+ return true;
74
+ }
75
+ if (obj == null || getClass() != obj.getClass()) {
76
+ return false;
77
+ }
78
+ TDMapColumnType other = (TDMapColumnType) obj;
79
+ return Objects.equal(this.keyType, other.keyType) &&
80
+ Objects.equal(this.valueType, other.valueType);
81
+ }
82
+
83
+ @Override
84
+ public int hashCode()
85
+ {
86
+ return Objects.hashCode(keyType, valueType);
87
+ }
88
+ }
@@ -0,0 +1,61 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ public enum TDPrimitiveColumnType
4
+ implements TDColumnType
5
+ {
6
+ INT("int"),
7
+ LONG("long"),
8
+ FLOAT("float"),
9
+ DOUBLE("double"),
10
+ BOOLEAN("boolean"),
11
+ STRING("string");
12
+
13
+ private String name;
14
+
15
+ private TDPrimitiveColumnType(String name)
16
+ {
17
+ this.name = name;
18
+ }
19
+
20
+ @Override
21
+ public String toString()
22
+ {
23
+ return name;
24
+ }
25
+
26
+ @Override
27
+ public boolean isPrimitive()
28
+ {
29
+ return true;
30
+ }
31
+
32
+ @Override
33
+ public boolean isArrayType()
34
+ {
35
+ return false;
36
+ }
37
+
38
+ @Override
39
+ public boolean isMapType()
40
+ {
41
+ return false;
42
+ }
43
+
44
+ @Override
45
+ public TDPrimitiveColumnType asPrimitiveType()
46
+ {
47
+ return this;
48
+ }
49
+
50
+ @Override
51
+ public TDArrayColumnType asArrayType()
52
+ {
53
+ return null;
54
+ }
55
+
56
+ @Override
57
+ public TDMapColumnType asMapType()
58
+ {
59
+ return null;
60
+ }
61
+ }
@@ -0,0 +1,64 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonCreator;
4
+ import com.fasterxml.jackson.annotation.JsonProperty;
5
+ import com.google.common.base.Objects;
6
+
7
+ import java.util.List;
8
+
9
+ public class TDTable
10
+ {
11
+ private String name;
12
+ private TDTableType type;
13
+ private List<TDColumn> columns;
14
+
15
+ @JsonCreator
16
+ public TDTable(
17
+ @JsonProperty("name") String name,
18
+ @JsonProperty("type") TDTableType type,
19
+ @JsonProperty("columns") List<TDColumn> columns)
20
+ {
21
+ this.name = name;
22
+ this.type = type;
23
+ this.columns = columns;
24
+ }
25
+
26
+ @JsonProperty
27
+ public String getName()
28
+ {
29
+ return name;
30
+ }
31
+
32
+ @JsonProperty
33
+ public TDTableType getType()
34
+ {
35
+ return type;
36
+ }
37
+
38
+ @JsonProperty
39
+ public List<TDColumn> getColumns()
40
+ {
41
+ return columns;
42
+ }
43
+
44
+ @Override
45
+ public boolean equals(Object obj)
46
+ {
47
+ if (this == obj) {
48
+ return true;
49
+ }
50
+ if (obj == null || getClass() != obj.getClass()) {
51
+ return false;
52
+ }
53
+ TDTable other = (TDTable) obj;
54
+ return Objects.equal(this.name, other.name) &&
55
+ Objects.equal(this.type, other.type) &&
56
+ Objects.equal(this.columns, other.columns);
57
+ }
58
+
59
+ @Override
60
+ public int hashCode()
61
+ {
62
+ return Objects.hashCode(name, type, columns);
63
+ }
64
+ }
@@ -0,0 +1,33 @@
1
+ package com.treasuredata.api.model;
2
+
3
+ import com.fasterxml.jackson.annotation.JsonCreator;
4
+ import com.fasterxml.jackson.annotation.JsonProperty;
5
+
6
+ import java.util.List;
7
+
8
+ public class TDTableList
9
+ {
10
+ private String name;
11
+ private List<TDTable> tables;
12
+
13
+ @JsonCreator
14
+ public TDTableList(
15
+ @JsonProperty("name") String name,
16
+ @JsonProperty("tables") List<TDTable> tables)
17
+ {
18
+ this.name = name;
19
+ this.tables = tables;
20
+ }
21
+
22
+ @JsonProperty
23
+ public String getName()
24
+ {
25
+ return name;
26
+ }
27
+
28
+ @JsonProperty
29
+ public List<TDTable> getTables()
30
+ {
31
+ return tables;
32
+ }
33
+ }