/* This file is part of Cyclos (www.cyclos.org). A project of the Social Trade Organisation (www.socialtrade.org). Cyclos is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Cyclos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Cyclos; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package nl.strohalm.cyclos.services.stats.activity; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javastat.inference.onesample.OneSampProp; import nl.strohalm.cyclos.dao.accounts.transactions.TransferDAO; import nl.strohalm.cyclos.dao.members.ElementDAO; import nl.strohalm.cyclos.entities.accounts.transactions.PaymentFilter; import nl.strohalm.cyclos.entities.groups.Group; import nl.strohalm.cyclos.entities.members.Member; import nl.strohalm.cyclos.entities.reports.StatisticalActivityQuery; import nl.strohalm.cyclos.entities.reports.StatisticalDTO; import nl.strohalm.cyclos.entities.reports.StatisticalNumber; import nl.strohalm.cyclos.services.stats.StatisticalService; import nl.strohalm.cyclos.utils.Pair; import nl.strohalm.cyclos.utils.Period; import nl.strohalm.cyclos.utils.statistics.ListOperations; /** * Class with common helper functions on retrieving statistics about transactions per member, for activity statistics. * @author Rinke */ public class TransactionCountPerMemberStats { /** * calculates the percentage of members not trading, including a confidence interval * * @param npart an int indicating the number of members not trading * @param nfull an int indicating the total number of members * @return a <code>StatisticalNumber</code> indicating the percentage of members not trading. */ public static StatisticalNumber getPercentageNoTraders(final int npart, final int nfull) { StatisticalNumber result = new StatisticalNumber(); if (nfull >= StatisticalService.MINIMUM_NUMBER_OF_VALUES && nfull > 0) { final double div = 1.0 - ((double) npart) / ((double) nfull); if (nfull - npart > 0) { final OneSampProp oneSampProp = new OneSampProp(StatisticalService.ALPHA, 0.5, "equal", nfull - npart, nfull); final Double lowerBound = oneSampProp.confidenceInterval[0] * 100; final Double upperBound = oneSampProp.confidenceInterval[1] * 100; result = new StatisticalNumber(div * 100, lowerBound, upperBound, new Integer(2).byteValue()); } else { result = new StatisticalNumber(div * 100, new Integer(2).byteValue()); } } return result; } private final PaymentFilter paymentFilter; private final TransferDAO transferDao; private List<Number> transfersForTraders; private final Period period; private final Collection<? extends Group> groups; public TransactionCountPerMemberStats(final StatisticalActivityQuery queryParameters, final Period period, final TransferDAO transferDao, final ElementDAO elementDao) { this.period = period; paymentFilter = queryParameters.getPaymentFilter(); this.transferDao = transferDao; groups = queryParameters.getGroups(); } /** * For each member, the number of transactions is counted. All these results are put in a list, which is returned by this method. * @return a List with Numbers representing the number of transactions each member performed */ public List<Number> getTransactionCountPerAllMembers(final Integer numberOfMembersForPeriod) { if (transfersForTraders == null) { getTransactionCountPerTradingMember(); } final List<Number> completeList = new ArrayList<Number>(); final int extra = numberOfMembersForPeriod - transfersForTraders.size(); for (int i = 0; i < extra; i++) { completeList.add(new Integer(0)); } completeList.addAll(transfersForTraders); return completeList; } /** * For each trading member, the number of transactions is counted. All these results are put in a list, which is returned by this method. * @return a List with Numbers representing the number of transactions each trading member performed */ public List<Number> getTransactionCountPerTradingMember() { if (transfersForTraders == null) { final List<Pair<Member, Integer>> countByMember = getTransfersPerTrader(); transfersForTraders = getTransfers(countByMember); } return transfersForTraders; } /** * @return a list with pairs, where the first element is the member, and the second is it's number of transfers. Only trading members are * included. */ public List<Pair<Member, Integer>> getTransfersPerTrader() { final StatisticalDTO dto = new StatisticalDTO(period, paymentFilter, groups); return transferDao.getNumberOfTransactionsPerMember(dto); } /** * gets a list with number of transfers, where each element is the personal number of transactions of a member * @param countByMember a list with <code>Pair</code>s, where the first element is the member, and the second is his number of transfers. */ private List<Number> getTransfers(final List<Pair<Member, Integer>> countByMember) { return ListOperations.getSecondNumberFromPairCollection(countByMember); } }