/**
 * 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.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;
  }
}
