/* * Copyright 2014-2016 CyberVision, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kaaproject.kaa.server.datamigration; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; import static com.datastax.driver.core.querybuilder.QueryBuilder.set; import static com.datastax.driver.core.querybuilder.QueryBuilder.update; import static java.lang.Long.parseLong; import com.datastax.driver.core.BatchStatement; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; import com.datastax.driver.core.utils.Bytes; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import org.bson.Document; import org.kaaproject.kaa.server.datamigration.model.Schema; import org.kaaproject.kaa.server.datamigration.utils.Options; import java.nio.ByteBuffer; import java.sql.Connection; import java.sql.SQLException; import java.util.Date; import java.util.List; public class CtlNotificationMigration extends AbstractCtlMigration { private MongoClient client; private Cluster cluster; private String dbName; private String nosql; /** * Create entity that responsible for data migration from old tables notification to * new ctl based ones. * * @param connection the connection to relational database * @param options the options for configuring NoSQL databases */ public CtlNotificationMigration(Connection connection, Options options) { super(connection); client = new MongoClient(options.getHost()); cluster = Cluster.builder() .addContactPoint(options.getHost()) .build(); dbName = options.getDbName(); this.nosql = options.getDbName(); } @Override protected List<Schema> transform() throws SQLException { List<Schema> res = super.transform(); if (nosql.equals(Options.DEFAULT_NO_SQL)) { MongoDatabase database = client.getDatabase(dbName); MongoCollection<Document> notification = database.getCollection("notification"); MongoCollection<Document> enpNotification = database.getCollection("endpoint_notification"); FindIterable<Document> cursor = notification.find(); for (Document document : cursor) { Object id = document.get("_id"); Long schemaId = parseLong((String) document.get("notification_schema_id")); notification.updateMany( Filters.eq("_id", id), Filters.eq("$set", Filters.eq("notification_schema_id", schemaId + idShift)) ); } cursor = enpNotification.find(); for (Document document : cursor) { Object id = document.get("_id"); Long schemaId = parseLong((String) document.get("notification.notification_schema_id")); notification.updateMany( Filters.eq("_id", id), Filters.eq("$set", Filters.eq( "notification.notification_schema_id", schemaId + idShift) ) ); } } else { Session session = cluster.connect(dbName); BatchStatement batchStatement = new BatchStatement(); //notification ResultSet results = session.execute(select().from("notification")); for (Row row : results) { String id = row.getString("nf_id"); Long schemaId = parseLong(row.getString("schema_id")); String[] ids = id.split("::"); batchStatement.add( update("notification") .with(set("schema_id", String.valueOf(schemaId + idShift))) .where(eq("topic_id", ids[0])) .and(eq("nf_type", ids[1])) .and(eq("nf_version", Integer.valueOf(ids[2]))) .and(eq("seq_num", Integer.valueOf(ids[3]))) ); } //endpoint notification results = session.execute(select().from("ep_nfs")); for (Row row : results) { String id = row.getString("nf_id"); Long schemaId = parseLong(row.getString("schema_id")); String[] ids = id.split("::"); ByteBuffer epKeyHash = Bytes.fromHexString(ids[0]); Date lastModTime = new Date(Long.valueOf(ids[1])); batchStatement.add( update("ep_nfs") .with(set("schema_id", String.valueOf(schemaId + idShift))) .where(eq("ep_key_hash", epKeyHash)) .and(eq("last_mod_time", lastModTime)) ); } session.execute(batchStatement); session.close(); cluster.close(); } return res; } @Override protected String getPrefixTableName() { return "notification"; } }