1

I have some Optional parameters in my application and I have to mount command with these parameters, so, now I'm using IF

class MergeBuilder(mergeBuilderConfig: MergeBuilderConfig) {

  def makeMergeCommand(): DeltaMergeBuilder = {

    val mergeSintax = mergeBuilderConfig.primaryKey
      .map(column => s"destination.$column = updates.$column")
      .mkString(" and ") + (if (!mergeBuilderConfig.partitionFilter.isEmpty) {
                              " and " + mergeBuilderConfig.partitionFilter
                            } else {
                              ""
                            })

    val mergeCommand =
      mergeBuilderConfig.deltaTable.alias("destination").merge(mergeBuilderConfig.sparkDf.alias("updates"), mergeSintax)

    if (mergeBuilderConfig.operationType == "upsert" && mergeBuilderConfig.setExpression.isEmpty) {
      mergeCommand
        .whenMatched(condition = mergeBuilderConfig.updateCondition.get)
        .updateAll(
        )
        .whenNotMatched()
        .insertAll()
    } else if (mergeBuilderConfig.operationType == "upsert" && !mergeBuilderConfig.setExpression.isEmpty) {
      mergeCommand
        .whenMatched(condition = mergeBuilderConfig.updateCondition.toString)
        .updateExpr(set = mergeBuilderConfig.setExpression.get)
    } else {
      mergeCommand.whenNotMatched().insertAll()
    }
  }
}

I will have more command Options, Do you have any idea how to avoid these Ifs?

Jacek Laskowski
  • 72,696
  • 27
  • 242
  • 420

1 Answers1

1

Why don't you try a pattern matching:

mergeBuilderConfig.operationType match {
case "upsert" if mergeBuilderConfig.setExpression.isEmpty =>  mergeCommand
    .whenMatched(condition = mergeBuilderConfig.updateCondition.get)
    .updateAll()
    .whenNotMatched()
    .insertAll()
case "upsert" =>  mergeCommand
    .whenMatched(condition = mergeBuilderConfig.updateCondition.toString)
    .updateExpr(set = mergeBuilderConfig.setExpression.get)
case _ => mergeCommand.whenNotMatched().insertAll()
}

If the commands get too "wordy" you can always define methods and call them:

mergeBuilderConfig.operationType match {
   case "upsert" if mergeBuilderConfig.setExpression.isEmpty => //functionWichPerformMerge
   case "upsert" =>  //Anotherfunction
   case _ => mergeCommand.whenNotMatched().insertAll()
}

Also if you always check for emptyness in set expression you can create a Tuple and check both values:

(mergeBuilderConfig.operationType, mergeBuilderConfig.setExpression.isEmpty) match {
   case ("upsert", true) => //functionWichPerformMerge
   case ("upsert", false) =>  //Anotherfunction
   case _ => mergeCommand.whenNotMatched().insertAll()
}
SCouto
  • 7,808
  • 5
  • 32
  • 49