/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.datatorrent.lib.db.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.hadoop.classification.InterfaceStability.Evolving;

import com.google.common.collect.Lists;

import com.datatorrent.api.Context.OperatorContext;
import com.datatorrent.api.DefaultOutputPort;
import com.datatorrent.api.annotation.OutputPortFieldAnnotation;

/**
 * A concrete implementation for {@link AbstractJdbcPollInputOperator} to
 * consume data from jdbc store and emit comma separated values <br>
 * 
 * @displayName Jdbc Polling Input Operator
 * @category Input
 * @tags database, sql, jdbc
 *
 * @since 3.5.0
 */
@Evolving
public class JdbcPollInputOperator extends AbstractJdbcPollInputOperator<String>
{
  @OutputPortFieldAnnotation
  public final transient DefaultOutputPort<String> outputPort = new DefaultOutputPort<>();
  private ArrayList<String> emitColumns;

  @Override
  public void setup(OperatorContext context)
  {
    super.setup(context);
    parseEmitColumnList();
  }

  private void parseEmitColumnList()
  {
    String[] cols = getColumnsExpression().split(",");
    emitColumns = Lists.newArrayList();
    for (int i = 0; i < cols.length; i++) {
      emitColumns.add(cols[i]);
    }
  }

  @Override
  public String getTuple(ResultSet rs)
  {
    StringBuilder resultTuple = new StringBuilder();
    try {
      for (String obj : emitColumns) {
        resultTuple.append(rs.getObject(obj) + ",");
      }
      return resultTuple.substring(0, resultTuple.length() - 1); //remove last comma
    } catch (SQLException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  protected void emitTuple(String tuple)
  {
    outputPort.emit(tuple);
  }
}
