/** * This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details. */ package edu.illinois.codingspectator.csvtotransactions; import java.util.Iterator; import java.util.List; import java.util.Map; /** * * @author Mohsen Vakilian * */ public class UDCRow extends CSVRow { private Map<String, String> row; private Transaction transaction; private List<String> allColumnNames; private String itemColumnName; private String timestampColumnName; private List<String> fixedColumnNames; private long timeWindowInMinutes; public UDCRow(Map<String, String> row, List<String> allColumnNames, String itemColumnName, String timestampColumnName, List<String> fixedColumnNames, long timeWindowInMinutes) { if (!UDCRow.isValid(row, allColumnNames, itemColumnName, timestampColumnName, fixedColumnNames)) { throw new IllegalArgumentException("Invalid row:\n" + row.toString()); } this.row= row; this.allColumnNames= allColumnNames; this.itemColumnName= itemColumnName; this.timestampColumnName= timestampColumnName; this.fixedColumnNames= fixedColumnNames; this.timeWindowInMinutes= timeWindowInMinutes; } private static boolean isValid(Map<String, String> row, List<String> allColumnNames, String itemColumnName, String timestampColumnName, List<String> fixedColumnNames) { return row.keySet().containsAll(allColumnNames) && allColumnNames.containsAll(fixedColumnNames) && allColumnNames.contains(timestampColumnName) && allColumnNames.contains(itemColumnName); } public String getItemColumnName() { return itemColumnName; } public String getTimestampColumnName() { return timestampColumnName; } @Override public List<String> getFixedColumnNames() { return fixedColumnNames; } private long getTimestamp() { return Long.parseLong(row.get(getTimestampColumnName())); } @Override public String getItem() { return row.get(getItemColumnName()); } @Override String getDetailedStringHeader() { StringBuilder sb= new StringBuilder(); Iterator<String> iterator= allColumnNames.iterator(); while (iterator.hasNext()) { sb.append(iterator.next()); if (iterator.hasNext()) { sb.append(","); } } return sb.toString(); } @Override public String getDetailedString() { StringBuilder sb= new StringBuilder(); Iterator<String> iterator= allColumnNames.iterator(); while (iterator.hasNext()) { sb.append(row.get(iterator.next())); if (iterator.hasNext()) { sb.append(","); } } return sb.toString(); } @Override public int hashCode() { return 31; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } UDCRow other= (UDCRow)obj; if (getItem() == null) { if (other.getItem() != null) { return false; } } else if (!getItem().equals(other.getItem())) { return false; } return true; } @Override public String toString() { return getItem(); } @Override public boolean shouldBelongToTheTransactionOf(CSVRow csvRow) { if (!(csvRow instanceof UDCRow)) { throw new IllegalArgumentException("Expected a UDCRow."); } UDCRow udcRow= (UDCRow)csvRow; for (String columnName : getFixedColumnNames()) { if (!row.get(columnName).equals(udcRow.row.get(columnName))) { return false; } } return Math.abs(getTimestamp() - udcRow.getTimestamp()) <= timeWindowInMinutes * 60 * 1000; } public Transaction getTransaction() { return transaction; } public void setTransaction(Transaction transaction) { this.transaction= transaction; transaction.add(this); } }