/**
 * 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 org.apache.apex.malhar.contrib.cassandra;

/**
 A pojo that represents the table row in which a row key is a composite
 */
public class CompositePrimaryKeyRow
{

  private String userid;

  private int day;

  private int month;

  private int year;

  private String employeeid;

  private String currentstatus;

  public String getUserid()
  {
    return userid;
  }

  public void setUserid(String userid)
  {
    this.userid = userid;
  }

  public int getDay()
  {
    return day;
  }

  public void setDay(int day)
  {
    this.day = day;
  }

  public int getMonth()
  {
    return month;
  }

  public void setMonth(int month)
  {
    this.month = month;
  }

  public int getYear()
  {
    return year;
  }

  public void setYear(int year)
  {
    this.year = year;
  }

  public String getEmployeeid()
  {
    return employeeid;
  }

  public void setEmployeeid(String employeeid)
  {
    this.employeeid = employeeid;
  }

  public String getCurrentstatus()
  {
    return currentstatus;
  }

  public void setCurrentstatus(String currentstatus)
  {
    this.currentstatus = currentstatus;
  }
}
