embulk-output-cassandra 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +45 -0
  5. data/build.gradle +97 -0
  6. data/config/checkstyle/checkstyle.xml +128 -0
  7. data/config/checkstyle/default.xml +108 -0
  8. data/embulk-output-cassandra.iml +13 -0
  9. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  10. data/gradle/wrapper/gradle-wrapper.properties +5 -0
  11. data/gradlew +172 -0
  12. data/gradlew.bat +84 -0
  13. data/lib/embulk/output/cassandra.rb +3 -0
  14. data/src/main/java/org/embulk/output/cassandra/CassandraOutputPlugin.java +283 -0
  15. data/src/main/java/org/embulk/output/cassandra/setter/BigintColumnSetter.java +41 -0
  16. data/src/main/java/org/embulk/output/cassandra/setter/BooleanColumnSetter.java +30 -0
  17. data/src/main/java/org/embulk/output/cassandra/setter/CassandraColumnSetter.java +51 -0
  18. data/src/main/java/org/embulk/output/cassandra/setter/CassandraColumnSetterFactory.java +60 -0
  19. data/src/main/java/org/embulk/output/cassandra/setter/ColumnSetterVisitor.java +96 -0
  20. data/src/main/java/org/embulk/output/cassandra/setter/DateColumnSetter.java +29 -0
  21. data/src/main/java/org/embulk/output/cassandra/setter/DecimalColumnSetter.java +43 -0
  22. data/src/main/java/org/embulk/output/cassandra/setter/DoubleColumnSetter.java +41 -0
  23. data/src/main/java/org/embulk/output/cassandra/setter/FloatColumnSetter.java +41 -0
  24. data/src/main/java/org/embulk/output/cassandra/setter/InetColumnSetter.java +26 -0
  25. data/src/main/java/org/embulk/output/cassandra/setter/IntColumnSetter.java +41 -0
  26. data/src/main/java/org/embulk/output/cassandra/setter/ListColumnSetter.java +22 -0
  27. data/src/main/java/org/embulk/output/cassandra/setter/MapColumnSetter.java +22 -0
  28. data/src/main/java/org/embulk/output/cassandra/setter/SetColumnSetter.java +24 -0
  29. data/src/main/java/org/embulk/output/cassandra/setter/SmallintColumnSetter.java +41 -0
  30. data/src/main/java/org/embulk/output/cassandra/setter/TextColumnSetter.java +50 -0
  31. data/src/main/java/org/embulk/output/cassandra/setter/TimeColumnSetter.java +46 -0
  32. data/src/main/java/org/embulk/output/cassandra/setter/TimestampColumnSetter.java +42 -0
  33. data/src/main/java/org/embulk/output/cassandra/setter/TimeuuidColumnSetter.java +18 -0
  34. data/src/main/java/org/embulk/output/cassandra/setter/TinyintColumnSetter.java +41 -0
  35. data/src/main/java/org/embulk/output/cassandra/setter/TupleColumnSetter.java +34 -0
  36. data/src/main/java/org/embulk/output/cassandra/setter/UuidColumnSetter.java +18 -0
  37. data/src/main/java/org/embulk/output/cassandra/setter/ValueConverter.java +63 -0
  38. data/src/main/java/org/embulk/output/cassandra/setter/VarintColumnSetter.java +43 -0
  39. data/src/test/java/org/embulk/output/cassandra/TestCassandraOutputPlugin.java +250 -0
  40. data/src/test/resources/org/embulk/output/cassandra/create_keyspace.cql +5 -0
  41. data/src/test/resources/org/embulk/output/cassandra/create_table_test_basic.cql +11 -0
  42. data/src/test/resources/org/embulk/output/cassandra/create_table_test_complex.cql +12 -0
  43. data/src/test/resources/org/embulk/output/cassandra/create_table_test_uuid.cql +8 -0
  44. data/src/test/resources/org/embulk/output/cassandra/test1.csv +4 -0
  45. data/src/test/resources/org/embulk/output/cassandra/test2.csv +2 -0
  46. data/src/test/resources/org/embulk/output/cassandra/test3.csv +2 -0
  47. data/src/test/resources/org/embulk/output/cassandra/test_basic.yaml +3 -0
  48. data/src/test/resources/org/embulk/output/cassandra/test_complex.yaml +3 -0
  49. data/src/test/resources/org/embulk/output/cassandra/test_uuid.yaml +3 -0
  50. metadata +141 -0
data/gradlew ADDED
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env sh
2
+
3
+ ##############################################################################
4
+ ##
5
+ ## Gradle start up script for UN*X
6
+ ##
7
+ ##############################################################################
8
+
9
+ # Attempt to set APP_HOME
10
+ # Resolve links: $0 may be a link
11
+ PRG="$0"
12
+ # Need this for relative symlinks.
13
+ while [ -h "$PRG" ] ; do
14
+ ls=`ls -ld "$PRG"`
15
+ link=`expr "$ls" : '.*-> \(.*\)$'`
16
+ if expr "$link" : '/.*' > /dev/null; then
17
+ PRG="$link"
18
+ else
19
+ PRG=`dirname "$PRG"`"/$link"
20
+ fi
21
+ done
22
+ SAVED="`pwd`"
23
+ cd "`dirname \"$PRG\"`/" >/dev/null
24
+ APP_HOME="`pwd -P`"
25
+ cd "$SAVED" >/dev/null
26
+
27
+ APP_NAME="Gradle"
28
+ APP_BASE_NAME=`basename "$0"`
29
+
30
+ # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31
+ DEFAULT_JVM_OPTS=""
32
+
33
+ # Use the maximum available, or set MAX_FD != -1 to use that value.
34
+ MAX_FD="maximum"
35
+
36
+ warn () {
37
+ echo "$*"
38
+ }
39
+
40
+ die () {
41
+ echo
42
+ echo "$*"
43
+ echo
44
+ exit 1
45
+ }
46
+
47
+ # OS specific support (must be 'true' or 'false').
48
+ cygwin=false
49
+ msys=false
50
+ darwin=false
51
+ nonstop=false
52
+ case "`uname`" in
53
+ CYGWIN* )
54
+ cygwin=true
55
+ ;;
56
+ Darwin* )
57
+ darwin=true
58
+ ;;
59
+ MINGW* )
60
+ msys=true
61
+ ;;
62
+ NONSTOP* )
63
+ nonstop=true
64
+ ;;
65
+ esac
66
+
67
+ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68
+
69
+ # Determine the Java command to use to start the JVM.
70
+ if [ -n "$JAVA_HOME" ] ; then
71
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72
+ # IBM's JDK on AIX uses strange locations for the executables
73
+ JAVACMD="$JAVA_HOME/jre/sh/java"
74
+ else
75
+ JAVACMD="$JAVA_HOME/bin/java"
76
+ fi
77
+ if [ ! -x "$JAVACMD" ] ; then
78
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79
+
80
+ Please set the JAVA_HOME variable in your environment to match the
81
+ location of your Java installation."
82
+ fi
83
+ else
84
+ JAVACMD="java"
85
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86
+
87
+ Please set the JAVA_HOME variable in your environment to match the
88
+ location of your Java installation."
89
+ fi
90
+
91
+ # Increase the maximum file descriptors if we can.
92
+ if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93
+ MAX_FD_LIMIT=`ulimit -H -n`
94
+ if [ $? -eq 0 ] ; then
95
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96
+ MAX_FD="$MAX_FD_LIMIT"
97
+ fi
98
+ ulimit -n $MAX_FD
99
+ if [ $? -ne 0 ] ; then
100
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
101
+ fi
102
+ else
103
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104
+ fi
105
+ fi
106
+
107
+ # For Darwin, add options to specify how the application appears in the dock
108
+ if $darwin; then
109
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110
+ fi
111
+
112
+ # For Cygwin, switch paths to Windows format before running java
113
+ if $cygwin ; then
114
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116
+ JAVACMD=`cygpath --unix "$JAVACMD"`
117
+
118
+ # We build the pattern for arguments to be converted via cygpath
119
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120
+ SEP=""
121
+ for dir in $ROOTDIRSRAW ; do
122
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
123
+ SEP="|"
124
+ done
125
+ OURCYGPATTERN="(^($ROOTDIRS))"
126
+ # Add a user-defined pattern to the cygpath arguments
127
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129
+ fi
130
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
131
+ i=0
132
+ for arg in "$@" ; do
133
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135
+
136
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138
+ else
139
+ eval `echo args$i`="\"$arg\""
140
+ fi
141
+ i=$((i+1))
142
+ done
143
+ case $i in
144
+ (0) set -- ;;
145
+ (1) set -- "$args0" ;;
146
+ (2) set -- "$args0" "$args1" ;;
147
+ (3) set -- "$args0" "$args1" "$args2" ;;
148
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154
+ esac
155
+ fi
156
+
157
+ # Escape application args
158
+ save () {
159
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160
+ echo " "
161
+ }
162
+ APP_ARGS=$(save "$@")
163
+
164
+ # Collect all arguments for the java command, following the shell quoting and substitution rules
165
+ eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166
+
167
+ # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168
+ if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169
+ cd "$(dirname "$0")"
170
+ fi
171
+
172
+ exec "$JAVACMD" "$@"
data/gradlew.bat ADDED
@@ -0,0 +1,84 @@
1
+ @if "%DEBUG%" == "" @echo off
2
+ @rem ##########################################################################
3
+ @rem
4
+ @rem Gradle startup script for Windows
5
+ @rem
6
+ @rem ##########################################################################
7
+
8
+ @rem Set local scope for the variables with windows NT shell
9
+ if "%OS%"=="Windows_NT" setlocal
10
+
11
+ set DIRNAME=%~dp0
12
+ if "%DIRNAME%" == "" set DIRNAME=.
13
+ set APP_BASE_NAME=%~n0
14
+ set APP_HOME=%DIRNAME%
15
+
16
+ @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17
+ set DEFAULT_JVM_OPTS=
18
+
19
+ @rem Find java.exe
20
+ if defined JAVA_HOME goto findJavaFromJavaHome
21
+
22
+ set JAVA_EXE=java.exe
23
+ %JAVA_EXE% -version >NUL 2>&1
24
+ if "%ERRORLEVEL%" == "0" goto init
25
+
26
+ echo.
27
+ echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28
+ echo.
29
+ echo Please set the JAVA_HOME variable in your environment to match the
30
+ echo location of your Java installation.
31
+
32
+ goto fail
33
+
34
+ :findJavaFromJavaHome
35
+ set JAVA_HOME=%JAVA_HOME:"=%
36
+ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37
+
38
+ if exist "%JAVA_EXE%" goto init
39
+
40
+ echo.
41
+ echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42
+ echo.
43
+ echo Please set the JAVA_HOME variable in your environment to match the
44
+ echo location of your Java installation.
45
+
46
+ goto fail
47
+
48
+ :init
49
+ @rem Get command-line arguments, handling Windows variants
50
+
51
+ if not "%OS%" == "Windows_NT" goto win9xME_args
52
+
53
+ :win9xME_args
54
+ @rem Slurp the command line arguments.
55
+ set CMD_LINE_ARGS=
56
+ set _SKIP=2
57
+
58
+ :win9xME_args_slurp
59
+ if "x%~1" == "x" goto execute
60
+
61
+ set CMD_LINE_ARGS=%*
62
+
63
+ :execute
64
+ @rem Setup the command line
65
+
66
+ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67
+
68
+ @rem Execute Gradle
69
+ "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70
+
71
+ :end
72
+ @rem End local scope for the variables with windows NT shell
73
+ if "%ERRORLEVEL%"=="0" goto mainEnd
74
+
75
+ :fail
76
+ rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77
+ rem the _cmd.exe /c_ return code!
78
+ if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79
+ exit /b 1
80
+
81
+ :mainEnd
82
+ if "%OS%"=="Windows_NT" endlocal
83
+
84
+ :omega
@@ -0,0 +1,3 @@
1
+ Embulk::JavaPlugin.register_output(
2
+ "cassandra", "org.embulk.output.cassandra.CassandraOutputPlugin",
3
+ File.expand_path('../../../../classpath', __FILE__))
@@ -0,0 +1,283 @@
1
+ package org.embulk.output.cassandra;
2
+
3
+ import com.datastax.driver.core.BoundStatement;
4
+ import com.datastax.driver.core.Cluster;
5
+ import com.datastax.driver.core.ColumnMetadata;
6
+ import com.datastax.driver.core.KeyspaceMetadata;
7
+ import com.datastax.driver.core.PreparedStatement;
8
+ import com.datastax.driver.core.Session;
9
+ import com.datastax.driver.core.SocketOptions;
10
+ import com.datastax.driver.core.TableMetadata;
11
+ import com.datastax.driver.core.querybuilder.Insert;
12
+ import com.datastax.driver.core.querybuilder.QueryBuilder;
13
+ import com.google.common.base.Optional;
14
+ import com.google.common.collect.ImmutableList;
15
+ import com.google.common.collect.ImmutableMap;
16
+ import com.google.common.collect.Lists;
17
+ import org.embulk.config.Config;
18
+ import org.embulk.config.ConfigDefault;
19
+ import org.embulk.config.ConfigDiff;
20
+ import org.embulk.config.ConfigSource;
21
+ import org.embulk.config.Task;
22
+ import org.embulk.config.TaskReport;
23
+ import org.embulk.config.TaskSource;
24
+ import org.embulk.output.cassandra.setter.CassandraColumnSetter;
25
+ import org.embulk.output.cassandra.setter.CassandraColumnSetterFactory;
26
+ import org.embulk.output.cassandra.setter.ColumnSetterVisitor;
27
+ import org.embulk.spi.Exec;
28
+ import org.embulk.spi.OutputPlugin;
29
+ import org.embulk.spi.Page;
30
+ import org.embulk.spi.PageReader;
31
+ import org.embulk.spi.Schema;
32
+ import org.embulk.spi.TransactionalPageOutput;
33
+ import org.slf4j.Logger;
34
+
35
+ import java.net.InetSocketAddress;
36
+ import java.util.List;
37
+ import java.util.Map;
38
+
39
+ public class CassandraOutputPlugin
40
+ implements OutputPlugin
41
+ {
42
+ public interface PluginTask
43
+ extends Task
44
+ {
45
+ @Config("hosts")
46
+ public List<String> gethosts();
47
+
48
+ @Config("port")
49
+ @ConfigDefault("9042")
50
+ public int getPort();
51
+
52
+ @Config("username")
53
+ @ConfigDefault("null")
54
+ public Optional<String> getUsername();
55
+
56
+ @Config("password")
57
+ @ConfigDefault("null")
58
+ public Optional<String> getPassword();
59
+
60
+ @Config("cluster_name")
61
+ @ConfigDefault("null")
62
+ public Optional<String> getClustername();
63
+
64
+ @Config("keyspace")
65
+ public String getKeyspace();
66
+
67
+ @Config("table")
68
+ public String getTable();
69
+
70
+ @Config("if_not_exists")
71
+ @ConfigDefault("false")
72
+ public Boolean getIfNotExists();
73
+
74
+ @Config("ttl")
75
+ @ConfigDefault("null")
76
+ public Optional<Integer> getTtl();
77
+
78
+ @Config("idempotent")
79
+ @ConfigDefault("false")
80
+ public Boolean getIdempotent();
81
+
82
+ @Config("connect_timeout")
83
+ @ConfigDefault("5000")
84
+ public int getConnectTimeout();
85
+
86
+ @Config("request_timeout")
87
+ @ConfigDefault("12000")
88
+ public int getRequestTimeout();
89
+ }
90
+
91
+ private final Logger logger = Exec.getLogger(CassandraOutputPlugin.class);
92
+
93
+ @Override
94
+ public ConfigDiff transaction(ConfigSource config,
95
+ Schema schema, int taskCount,
96
+ OutputPlugin.Control control)
97
+ {
98
+ PluginTask task = config.loadConfig(PluginTask.class);
99
+
100
+ return resume(task.dump(), schema, taskCount, control);
101
+ }
102
+
103
+ @Override
104
+ public ConfigDiff resume(TaskSource taskSource,
105
+ Schema schema, int taskCount,
106
+ OutputPlugin.Control control)
107
+ {
108
+ control.run(taskSource);
109
+ return Exec.newConfigDiff();
110
+ }
111
+
112
+ @Override
113
+ public void cleanup(TaskSource taskSource,
114
+ Schema schema, int taskCount,
115
+ List<TaskReport> successTaskReports)
116
+ {
117
+ }
118
+
119
+ @Override
120
+ public TransactionalPageOutput open(TaskSource taskSource, Schema schema, int taskIndex)
121
+ {
122
+ PluginTask task = taskSource.loadTask(PluginTask.class);
123
+ PageReader pageReader = new PageReader(schema);
124
+ Cluster cluster = getCluster(task);
125
+
126
+ Session session = cluster.newSession();
127
+
128
+ KeyspaceMetadata keyspaceMetadata = cluster.getMetadata().getKeyspace(task.getKeyspace());
129
+ if (keyspaceMetadata == null) {
130
+ throw new RuntimeException("keyspace `" + task.getKeyspace() + "` is not found");
131
+ }
132
+
133
+ TableMetadata tableMetadata = keyspaceMetadata.getTable(task.getTable());
134
+ if (tableMetadata == null) {
135
+ throw new RuntimeException("table `" + task.getTable() + "` is not found");
136
+ }
137
+
138
+ Insert insert = QueryBuilder.insertInto(task.getKeyspace(), task.getTable());
139
+ if (task.getIfNotExists()) {
140
+ insert.ifNotExists();
141
+ }
142
+ if (task.getTtl().isPresent()) {
143
+ insert.using(QueryBuilder.ttl(task.getTtl().get()));
144
+ }
145
+
146
+ ImmutableMap.Builder<String, CassandraColumnSetter> columnSettersBuilder = ImmutableMap.builder();
147
+ ImmutableList.Builder<String> uuidColumnsBuilder = ImmutableList.builder();
148
+ for (ColumnMetadata column : tableMetadata.getColumns()) {
149
+ insert.value(column.getName(), QueryBuilder.bindMarker(column.getName()));
150
+ columnSettersBuilder.put(column.getName(), CassandraColumnSetterFactory.createColumnSetter(column, cluster));
151
+ switch (column.getType().getName()) {
152
+ case UUID:
153
+ case TIMEUUID:
154
+ uuidColumnsBuilder.add(column.getName());
155
+ }
156
+ }
157
+ Map<String, CassandraColumnSetter> columnSetters = columnSettersBuilder.build();
158
+ List<String> uuidColumns = uuidColumnsBuilder.build();
159
+ List<ColumnSetterVisitor> columnVisitors = Lists.transform(schema.getColumns(), (column) ->
160
+ new ColumnSetterVisitor(pageReader, columnSetters.get(column.getName())));
161
+
162
+ logger.info("Insert Query: {}", insert.getQueryString());
163
+
164
+ PreparedStatement prepared = session.prepare(insert);
165
+ if (task.getIdempotent()) {
166
+ prepared.setIdempotent(task.getIdempotent());
167
+ }
168
+
169
+ return new PluginPageOuput(cluster, session, pageReader, tableMetadata, uuidColumns, columnSetters, columnVisitors, prepared, task);
170
+ }
171
+
172
+ private Cluster getCluster(PluginTask task)
173
+ {
174
+ Cluster.Builder builder = Cluster.builder();
175
+ for (String host : task.gethosts()) {
176
+ builder.addContactPointsWithPorts(new InetSocketAddress(host, task.getPort()));
177
+ }
178
+
179
+ if (task.getUsername().isPresent()) {
180
+ builder.withCredentials(task.getUsername().get(), task.getPassword().orNull());
181
+ }
182
+
183
+ if (task.getClustername().isPresent()) {
184
+ builder.withClusterName(task.getClustername().get());
185
+ }
186
+
187
+ builder.withSocketOptions(
188
+ new SocketOptions()
189
+ .setConnectTimeoutMillis(task.getConnectTimeout())
190
+ .setReadTimeoutMillis(task.getRequestTimeout()));
191
+
192
+ return builder.build();
193
+ }
194
+
195
+ public class PluginPageOuput implements TransactionalPageOutput
196
+ {
197
+ private final Cluster cluster;
198
+ private final Session session;
199
+ private final PageReader pageReader;
200
+ private final TableMetadata tableMetadata;
201
+ private final List<String> uuidColumns;
202
+ private final Map<String, CassandraColumnSetter> columnSetters;
203
+ private final List<ColumnSetterVisitor> columnVisitors;
204
+ private final PreparedStatement prepared;
205
+ private final PluginTask task;
206
+ private long counter = 0;
207
+ private long nextLoggingCount = 1;
208
+
209
+ public PluginPageOuput(
210
+ Cluster cluster,
211
+ Session session,
212
+ PageReader pageReader,
213
+ TableMetadata tableMetadata,
214
+ List<String> uuidColumns,
215
+ Map<String, CassandraColumnSetter> columnSetters,
216
+ List<ColumnSetterVisitor> columnVisitors,
217
+ PreparedStatement prepared,
218
+ PluginTask task)
219
+ {
220
+ this.cluster = cluster;
221
+ this.session = session;
222
+ this.pageReader = pageReader;
223
+ this.tableMetadata = tableMetadata;
224
+ this.uuidColumns = uuidColumns;
225
+ this.columnSetters = columnSetters;
226
+ this.columnVisitors = columnVisitors;
227
+ this.prepared = prepared;
228
+ this.task = task;
229
+ }
230
+
231
+ @Override
232
+ public void add(Page page)
233
+ {
234
+ pageReader.setPage(page);
235
+ while (pageReader.nextRecord()) {
236
+ BoundStatement statement = prepared.bind();
237
+
238
+ for (String uuidColumn : uuidColumns) {
239
+ columnSetters.get(uuidColumn).setNullValue(statement);
240
+ }
241
+
242
+ for (int i = 0; i < pageReader.getSchema().getColumns().size(); i++) {
243
+ ColumnSetterVisitor visitor = columnVisitors.get(i);
244
+ visitor.setStatement(statement);
245
+ if (visitor.hasSetter()) {
246
+ pageReader.getSchema().getColumn(i).visit(visitor);
247
+ }
248
+ }
249
+ session.execute(statement);
250
+ counter++;
251
+ if (counter >= nextLoggingCount) {
252
+ logger.info("Inserted {} records", counter);
253
+ nextLoggingCount = nextLoggingCount * 2;
254
+ }
255
+ }
256
+ }
257
+
258
+ @Override
259
+ public void finish()
260
+ {
261
+ }
262
+
263
+ @Override
264
+ public void close()
265
+ {
266
+ session.close();
267
+ cluster.close();
268
+ }
269
+
270
+ @Override
271
+ public void abort()
272
+ {
273
+ }
274
+
275
+ @Override
276
+ public TaskReport commit()
277
+ {
278
+ TaskReport report = Exec.newTaskReport();
279
+ report.set("inserted_record_count", counter);
280
+ return report;
281
+ }
282
+ }
283
+ }