Java Method Implementation - Analytics Database - Teradata Vantage

SQL External Routine Programming

Deployment
VantageCloud
VantageCore
Edition
Enterprise
IntelliFlex
VMware
Product
Analytics Database
Teradata Vantage
Release Number
17.20
Published
June 2022
Language
English (United States)
Last Update
2023-07-11
dita:mapPath
iiv1628111441820.ditamap
dita:ditavalPath
qkf1628213546010.ditaval
dita:id
B035-1147
lifecycle
latest
Product Category
Teradata Vantageā„¢
package examples;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import com.teradata.fnc.TeradataType;
import com.teradata.fnc.operator.MetaData;
import com.teradata.fnc.operator.TableOperator;
import com.teradata.fnc.operator.TeradataResultSet;
import com.teradata.fnc.runtime.ColumnDefinition;
import com.teradata.fnc.runtime.RuntimeContract;
import com.teradata.fnc.value.MismatchException;
import com.teradata.fnc.value.RangeException;
import com.teradata.fnc.value.Value;
public class Sessionize implements TableOperator{

   public int contract(RuntimeContract contract, ResultSet[] rsin, ResultSet[] arg2)
         throws SQLException {

      /* Create the number of output columns plus additional SessionID. */
      MetaData iCols = ((TeradataResultSet)rsin[0]).getTeradataMetaData();
      ColumnDefinition OutCols[] = new ColumnDefinition[iCols.getColumnCount() + 1];
      int col = 0;

      /* Copy input columns to output columns. */
      for (col=0;col<iCols.getColumnCount();col++) {
         OutCols[col] = new ColumnDefinition(iCols.getColumnName(col+1), iCols.getTeradataColumnType(col+1));
         OutCols[col].setDisplayLength(iCols.getColumnDisplaySize(col+1));
         switch (TeradataType.get(iCols.getTeradataColumnType(col+1))) {
            case VARCHAR_DT:
            case CHAR_DT:
               OutCols[col].setCharset(iCols.getPrecision(col+1));
               break;
            case VARBYTE_DT:
               OutCols[col].setCharset(iCols.getPrecision(col+1));
               OutCols[col].setDisplayLength(iCols.getColumnDisplaySize(col+1));
               break;
            case TIME_DT:
            case TIMESTAMP_DT:
            case TIME_WTZ_DT:
            case TIMESTAMP_WTZ_DT:
               OutCols[col].setPrecision(iCols.getPrecision(col+1));
               break;
            default:
               OutCols[col].setPrecision(iCols.getPrecision(col+1));
               OutCols[col].setScale(iCols.getScale(col+1));
               break;
         }
      }

      /* Add SessionID column. */
      OutCols[col] = new ColumnDefinition("SessionID", TeradataType.INTEGER_DT);
      OutCols[col++].setDisplayLength(4); 

      /* Set output columns and complete the contract. */
      contract.setOutputInfo(0, OutCols);
      contract.complete();
      return 1;

   } /* contract */

   public void execute(RuntimeContract contract, ResultSet[] rsin, ResultSet[] rsout)
         throws SQLException {

      try {
         int currentSessionId = 0;
         long lastTime = 0;
         String TimeColumn = (String)((Value)contract.getInputInfo().getCustom().get("TimeCol")).getObject();
         byte timevalue = ((Value)contract.getInputInfo().getCustom().get("timeout")).getByte();
         long window = timevalue*1000;
         int colcount = rsin[0].getMetaData().getColumnCount();

         /* Copy user data adding a sessionization column. */
         while (rsin[0].next()) {
            /* Determine if time of this click is more than the window after the last. */
            Timestamp currentTime = (Timestamp) rsin[0].getObject(TimeColumn);
            if ( currentTime.getTime() > lastTime + window) {
               currentSessionId++;
            }

            for(int i=1;i<=colcount;i++) {
               Object o = rsin[0].getObject(i);
               if(rsin[0].wasNull())
                  rsout[0].updateObject(i, null);
               else {
                  rsout[0].updateObject(i, o);
               }
            }

            /* Add session info. */
            rsout[0].updateObject(colcount+1, currentSessionId);
            rsout[0].insertRow();
            lastTime = currentTime.getTime();
         }
      } catch (MistmatchException e1) {
            throw new SQLException("T0002", "Invalid timeout value numeric");
      } catch (RangeException e1) {
            throw new SQLException("T0002", "Invalid timeout value 1-30");
      }

   } /* execute */
}