All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.stratio.datasource.mongodb.writer.MongodbBatchWriter.scala Maven / Gradle / Ivy

/**
 * Copyright (C) 2015 Stratio (http://stratio.com)
 *
 * 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 com.stratio.datasource.mongodb.writer

import com.mongodb.casbah.Imports._
import com.stratio.datasource.mongodb.config.MongodbConfig
import com.stratio.datasource.util.Config

/**
 * A batch writer implementation for mongodb writer.
 * The used semantics for storing objects is 'replace'.
 *
 * @param config Configuration parameters (host,database,collection,...)
 */
private[mongodb] class MongodbBatchWriter(config: Config) extends MongodbWriter(config) {

  private val IdKey = "_id"

  private val bulkBatchSize = config.getOrElse[Int](MongodbConfig.BulkBatchSize, MongodbConfig.DefaultBulkBatchSize)

  private val pkConfig: Option[Array[String]] = config.get[Array[String]](MongodbConfig.UpdateFields)

  override def save(it: Iterator[DBObject], mongoClient: MongoClient): Unit = {
    it.grouped(bulkBatchSize).foreach { group =>
      val bulkOperation = dbCollection(mongoClient).initializeUnorderedBulkOperation
      group.foreach { element =>
        val query = getUpdateQuery(element)
        if (query.isEmpty) bulkOperation.insert(element)
        else bulkOperation.find(query).upsert().replaceOne(element)
      }

      bulkOperation.execute(writeConcern)
    }
  }

  private def getUpdateQuery(element: DBObject): Map[String, AnyRef] = {
    if(element.contains(IdKey)) Map(IdKey -> element.get(IdKey))
    else {
      val pkValues : Map[String, AnyRef] =
        if (pkConfig.isDefined)
          pkConfig.get.flatMap(field => if (element.contains(field)) Some(field -> element.get(field)) else None).toMap
        else Map.empty[String, AnyRef]
      pkValues
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy