/**
  * Builds filter expression for IN condition
  *
  * @param string $operator The operator to use. Anything could be used e.g. '`IN`'.
  * @param array  $columns  The columns of composite IN condition.
  * @param array  $values   The values of composite IN condition.
  * @param array  $params   The binding parameters to be populated.
  * @return string Filter expression.
  * @throws Exception No NULL value in DynamoDB.
  */
 protected function buildCompositeInCondition($operator, $columns, $values, &$params)
 {
     $vss = [];
     foreach ($values as $value) {
         $vs = [];
         foreach ($columns as $column) {
             if (isset($value[$column])) {
                 $phName = self::PARAM_PREFIX . count($params);
                 $params[$phName] = $value[$column];
                 $vs[] = $phName;
             } else {
                 throw new Exception(__METHOD__ . ' cannot include NULL value.');
             }
         }
         $vss[] = '(' . implode(', ', $vs) . ')';
     }
     foreach ($columns as $i => $column) {
         if (strpos($column, '(') === false) {
             $columns[$i] = $this->db->quoteColumnName($column);
         }
     }
     return '(' . implode(', ', $columns) . ") {$operator} (" . implode(', ', $vss) . ')';
 }