edu.monash.merc.dao.TrafficLightDAO.java Source code

Java tutorial

Introduction

Here is the source code for edu.monash.merc.dao.TrafficLightDAO.java

Source

/*
 * Copyright (c) 2011-2013, Monash e-Research Centre
 * (Monash University, Australia)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * Neither the name of the Monash University nor the names of its
 *      contributors may be used to endorse or promote products derived from
 *      this software without specific prior written permission.
 *
 * This program 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 Affero General Public License for more details.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */

package edu.monash.merc.dao;

import edu.monash.merc.common.name.ChromType;
import edu.monash.merc.common.name.DataType;
import edu.monash.merc.common.page.Pagination;
import edu.monash.merc.common.sql.OrderBy;
import edu.monash.merc.domain.TPBVersion;
import edu.monash.merc.domain.TrafficLight;
import edu.monash.merc.dto.TLSumReporter;
import edu.monash.merc.dto.TLTypeSumReporter;
import edu.monash.merc.dto.tl.TLSearchBean;
import edu.monash.merc.dto.tl.TLTypeEvLevelFilter;
import edu.monash.merc.repository.ITrafficLightRep;
import edu.monash.merc.util.DMUtil;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.*;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * TrafficLightDAO class which provides the database operations for TrafficLight object.
 *
 * @author Simon Yu
 *         <p/>
 *         Email: xiaoming.yu@monash.edu
 * @version 1.0
 * @since 1.0
 *        <p/>
 *        Date: 9/03/12 11:57 AM
 */
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Repository
public class TrafficLightDAO extends HibernateGenericDAO<TrafficLight> implements ITrafficLightRep {

    /**
     * {@inheritDoc}
     */
    public void deleteTLById(long id) {
        String del_hql = "DELETE FROM " + this.persistClass.getSimpleName() + " AS tl WHERE tl.id = :id";
        Query query = this.session().createQuery(del_hql);
        query.setLong("id", id);
        query.executeUpdate();
    }

    /**
     * {@inheritDoc}
     */
    public TrafficLight getTLByChromEnsemblAcVersionToken(ChromType chromType, String ensgAc, long versionId,
            int trackToken) {
        Criteria qCriteria = this.session().createCriteria(this.persistClass);

        Criteria tlGeneCriteria = qCriteria.createCriteria("tlGene");
        tlGeneCriteria.add(Restrictions.eq("chromosome", chromType.chm()));

        Disjunction orConds = Restrictions.disjunction();
        orConds.add(Restrictions.eq("ensgAccession", ensgAc));
        tlGeneCriteria.add(orConds);
        Criteria tpbVCriteria = qCriteria.createCriteria("tpbVersion");
        tpbVCriteria.add(Restrictions.eq("id", versionId));
        tpbVCriteria.add(Restrictions.eq("trackToken", trackToken));
        return (TrafficLight) qCriteria.uniqueResult();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public Pagination<TrafficLight> getVersionTrafficLight(ChromType chromType, int trackToken, long versionId,
            int startPage, int recordsPerPage, OrderBy[] orderConds) {

        Criteria tlCriteria = this.session().createCriteria(this.persistClass);
        Criteria tlgCriteria = tlCriteria.createCriteria("tlGene");
        Criteria tpbVCriteria = tlCriteria.createCriteria("tpbVersion");
        tlgCriteria.add(Restrictions.eq("chromosome", chromType.chm()));
        // tlgCriteria.add(Restrictions.in("displayName", geneNames));
        tpbVCriteria.add(Restrictions.eq("id", versionId));
        tpbVCriteria.add(Restrictions.eq("trackToken", trackToken));
        tlCriteria.setProjection(Projections.rowCount());
        int total = ((Long) tlCriteria.uniqueResult()).intValue();
        //get all results
        if (recordsPerPage == -1) {
            recordsPerPage = total;
            startPage = 1;
        }
        Pagination<TrafficLight> ptl = new Pagination<TrafficLight>(startPage, recordsPerPage, total);

        Criteria tlQCriteria = this.session().createCriteria(this.persistClass);
        Criteria tlgQCriteria = tlQCriteria.createCriteria("tlGene");
        Criteria tpbVQCriteria = tlQCriteria.createCriteria("tpbVersion");
        tlgQCriteria.add(Restrictions.eq("chromosome", chromType.chm()));
        tpbVQCriteria.add(Restrictions.eq("id", versionId));
        tpbVQCriteria.add(Restrictions.eq("trackToken", trackToken));
        // add orders
        if (orderConds != null && orderConds.length > 0) {
            for (int i = 0; i < orderConds.length; i++) {
                Order order = orderConds[i].getOrder();
                if (order != null) {
                    tlgQCriteria.addOrder(order);
                }
            }
        }
        tlQCriteria.setFirstResult(ptl.getFirstResult());
        tlQCriteria.setMaxResults(ptl.getSizePerPage());

        List<TrafficLight> tlList = tlQCriteria.list();
        ptl.setPageResults(tlList);
        return ptl;
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public Pagination<TrafficLight> getVersionTrafficLight(TLSearchBean tlSearchBean, int startPage,
            int recordsPerPage, OrderBy[] orderConds) {

        String chromType = tlSearchBean.getSelectedChromType();
        int token = tlSearchBean.getCombinatedToken();
        long versionId = tlSearchBean.getSelectedVersion();
        boolean chromRegionProvided = tlSearchBean.isRegionProvided();
        boolean geneListProvided = tlSearchBean.isGeneListProvided();

        boolean typeLevelProvided = tlSearchBean.isTypeLevelProvided();

        Criteria tlCrt = this.session().createCriteria(this.persistClass);

        if (typeLevelProvided) {
            addTypeColorLevelConditions(tlCrt, tlSearchBean);
        }

        Criteria tlGeneCrt = tlCrt.createCriteria("tlGene");

        Criteria tpbVersionCrt = tlCrt.createCriteria("tpbVersion");
        tlGeneCrt.add(Restrictions.eq("chromosome", chromType));
        //chromosome region provided
        if (chromRegionProvided) {
            addChromRegionConditions(tlGeneCrt, tlSearchBean);
        }
        //gene list provided
        if (geneListProvided) {
            addGeneListConditions(tlGeneCrt, tlSearchBean);
        }

        tpbVersionCrt.add(Restrictions.eq("id", versionId));
        tpbVersionCrt.add(Restrictions.eq("trackToken", token));
        tlCrt.setProjection(Projections.rowCount());

        int total = ((Long) tlCrt.uniqueResult()).intValue();
        //get all results
        if (recordsPerPage == -1) {
            recordsPerPage = total;
            startPage = 1;
        }

        Pagination<TrafficLight> paginationTl = new Pagination<TrafficLight>(startPage, recordsPerPage, total);

        Criteria tlCriteria = this.session().createCriteria(this.persistClass);

        if (typeLevelProvided) {
            addTypeColorLevelConditions(tlCriteria, tlSearchBean);
        }

        Criteria tlGeneCriteria = tlCriteria.createCriteria("tlGene");

        Criteria tpbVersionCriteria = tlCriteria.createCriteria("tpbVersion");
        tlGeneCriteria.add(Restrictions.eq("chromosome", chromType));

        //chromosome region provided
        if (chromRegionProvided) {
            addChromRegionConditions(tlGeneCriteria, tlSearchBean);
        }
        //gene list provided
        if (geneListProvided) {
            addGeneListConditions(tlGeneCriteria, tlSearchBean);
        }

        //tpb version
        tpbVersionCriteria.add(Restrictions.eq("id", versionId));
        tpbVersionCriteria.add(Restrictions.eq("trackToken", token));
        // add orders
        if (orderConds != null && orderConds.length > 0) {
            for (int i = 0; i < orderConds.length; i++) {
                Order order = orderConds[i].getOrder();
                if (order != null) {
                    tlGeneCriteria.addOrder(order);
                }
            }
        }
        tlCriteria.setFirstResult(paginationTl.getFirstResult());
        tlCriteria.setMaxResults(paginationTl.getSizePerPage());

        List<TrafficLight> tlList = tlCriteria.list();
        paginationTl.setPageResults(tlList);

        return paginationTl;
    }

    private void addTypeColorLevelConditions(Criteria criteria, TLSearchBean tlSearchBean) {
        if (tlSearchBean.isTypeLevelProvided()) {
            List<TLTypeEvLevelFilter> tlTypeLevelFilters = tlSearchBean.getTlTypeEvLevelFilters();
            for (TLTypeEvLevelFilter tlevelFilter : tlTypeLevelFilters) {
                if (tlevelFilter.isValidTypeLevel()) {
                    String dataType = tlevelFilter.getDataType();
                    List<Integer> colorLevels = tlevelFilter.getCheckedColorLevels();
                    addSpecificTPBTypeColorLevelConditions(criteria, dataType, colorLevels);
                }
            }
        }
    }

    private void addSpecificTPBTypeColorLevelConditions(Criteria criteria, String dataType,
            List<Integer> colorLevels) {
        //convert the dataType into DataType
        DataType tpbDataType = DataType.fromType(dataType);
        //PE
        if (DataType.PE.equals(tpbDataType)) {
            Criteria peColorCriteria = criteria.createCriteria("tlPEColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                peColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE MS
        if (DataType.PE_MS.equals(tpbDataType)) {
            Criteria peMsColorCriteria = criteria.createCriteria("tlPEMSColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peMsColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peMsColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE MS Ann
        if (DataType.PE_MS_ANN.equals(tpbDataType)) {
            Criteria peMsAnnColorCriteria = criteria.createCriteria("tlPEMSANNColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peMsAnnColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peMsAnnColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE MS Prob
        if (DataType.PE_MS_PROB.equals(tpbDataType)) {
            Criteria peMsProbColorCriteria = criteria.createCriteria("tlPEMSPROBColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peMsProbColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peMsProbColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE MS Sam
        if (DataType.PE_MS_SAM.equals(tpbDataType)) {
            Criteria peMsSamColorCriteria = criteria.createCriteria("tlPEMSSAMColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peMsSamColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peMsSamColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE ANTI
        if (DataType.PE_ANTI.equals(tpbDataType)) {
            Criteria peAntiColorCriteria = criteria.createCriteria("tlPEANTIColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peAntiColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peAntiColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE ANTI ANN
        if (DataType.PE_ANTI_ANN.equals(tpbDataType)) {
            Criteria peAntiAnnColorCriteria = criteria.createCriteria("tlPEANTIANNColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peAntiAnnColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peAntiAnnColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE ANTI IHC
        if (DataType.PE_ANTI_IHC.equals(tpbDataType)) {
            Criteria peAntiIhcColorCriteria = criteria.createCriteria("tlPEANTIIHCColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peAntiIhcColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peAntiIhcColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE ANTI IHC Norm
        if (DataType.PE_ANTI_IHC_NORM.equals(tpbDataType)) {
            Criteria peAntiIhcNormColorCriteria = criteria.createCriteria("tlPEANTIIHCNORMColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peAntiIhcNormColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peAntiIhcNormColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE OTH
        if (DataType.PE_OTH.equals(tpbDataType)) {
            Criteria peOthColorCriteria = criteria.createCriteria("tlPEOTHColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peOthColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peOthColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PE OTH Cur
        if (DataType.PE_OTH_CUR.equals(tpbDataType)) {
            Criteria peOthCurColorCriteria = criteria.createCriteria("tlPEOTHCURColor");
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                peOthCurColorCriteria.add(colorLevelOr);
            }
            if (colorLevels != null && colorLevels.size() == 1) {
                peOthCurColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM
        if (DataType.PTM.equals(tpbDataType)) {
            Criteria ptmColorCriteria = criteria.createCriteria("tlPTMColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM PHS
        if (DataType.PTM_PHS.equals(tpbDataType)) {
            Criteria ptmPhsColorCriteria = criteria.createCriteria("tlPTMPHSColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmPhsColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmPhsColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM PHS SER
        if (DataType.PTM_PHS_SER.equals(tpbDataType)) {
            Criteria ptmPhsSerColorCriteria = criteria.createCriteria("tlPTMPHSSERColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmPhsSerColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmPhsSerColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM PHS THR
        if (DataType.PTM_PHS_THR.equals(tpbDataType)) {
            Criteria ptmPhsThrColorCriteria = criteria.createCriteria("tlPTMPHSTHRColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmPhsThrColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmPhsThrColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM PHS TYR
        if (DataType.PTM_PHS_TYR.equals(tpbDataType)) {
            Criteria ptmPhsTyrColorCriteria = criteria.createCriteria("tlPTMPHSTYRColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmPhsTyrColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmPhsTyrColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM ACE
        if (DataType.PTM_ACE.equals(tpbDataType)) {
            Criteria ptmAceColorCriteria = criteria.createCriteria("tlPTMACEColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmAceColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmAceColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM ACE LYS
        if (DataType.PTM_ACE_LYS.equals(tpbDataType)) {
            Criteria ptmAceLysColorCriteria = criteria.createCriteria("tlPTMACELYSColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmAceLysColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmAceLysColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //PTM ACE NTA
        if (DataType.PTM_ACE_NTA.equals(tpbDataType)) {
            Criteria ptmAceNtaColorCriteria = criteria.createCriteria("tlPTMACENTAColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                ptmAceNtaColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                ptmAceNtaColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //TE
        if (DataType.TE.equals(tpbDataType)) {
            Criteria teColorCriteria = criteria.createCriteria("tlTEColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                teColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                teColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //TE MA
        if (DataType.TE_MA.equals(tpbDataType)) {
            Criteria teMaColorCriteria = criteria.createCriteria("tlTEMAColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                teMaColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                teMaColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //TE MA PROP
        if (DataType.TE_MA_PROP.equals(tpbDataType)) {
            Criteria teMaPropColorCriteria = criteria.createCriteria("tlTEMAPROPColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                teMaPropColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                teMaPropColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //TE OTH
        if (DataType.TE_OTH.equals(tpbDataType)) {
            Criteria teOthColorCriteria = criteria.createCriteria("tlTEOTHColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                teOthColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                teOthColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

        //TE OTH CUR
        if (DataType.TE_OTH_CUR.equals(tpbDataType)) {
            Criteria teOthCurColorCriteria = criteria.createCriteria("tlTEOTHCURColor");
            //color level size is great than one. we use or condition
            if (colorLevels != null && colorLevels.size() > 1) {
                Disjunction colorLevelOr = Restrictions.disjunction();
                for (Integer level : colorLevels) {
                    colorLevelOr.add(Restrictions.eq("colorLevel", level.intValue()));
                }
                teOthCurColorCriteria.add(colorLevelOr);
            }
            //if only on color level, we just use eq condition
            if (colorLevels != null && colorLevels.size() == 1) {
                teOthCurColorCriteria.add(Restrictions.eq("colorLevel", colorLevels.get(0).intValue()));
            }
        }

    }

    private void addChromRegionConditions(Criteria geneCriteria, TLSearchBean tlSearchBean) {
        if (tlSearchBean.isRegionProvided()) {
            long regionFrom = tlSearchBean.getRegionFrom();
            long regionTo = tlSearchBean.getRegionTo();
            if (regionFrom != 0 && regionTo != 0) {
                geneCriteria.add(Restrictions.ge("endPosition", regionFrom))
                        .add(Restrictions.le("startPosition", regionTo));
            }
            if (regionFrom != 0 && regionTo == 0) {
                geneCriteria.add(Restrictions.ge("endPosition", regionFrom));
            }
            if (regionFrom == 0 && regionTo != 0) {
                geneCriteria.add(Restrictions.le("startPosition", regionTo));
            }
        }
    }

    private void addGeneListConditions(Criteria geneCriteria, TLSearchBean tlSearchBean) {
        if (tlSearchBean.isGeneListProvided()) {
            String geneValueStr = tlSearchBean.getGeneTypeValues();
            //separated by comma,semicolon, space, tab or newline
            String[] geneValues = DMUtil.splitByDelims(geneValueStr, ",", ";", " ", "\n", "\t");

            String selectedGeneType = tlSearchBean.getSelectedGeneValueType();

            if (geneValues.length > 1) {
                if (StringUtils.equals("accession", selectedGeneType)) {
                    geneCriteria.add(Restrictions.in("ensgAccession", geneValues));
                }
                if (StringUtils.equals("symbol", selectedGeneType)) {
                    geneCriteria.add(Restrictions.in("displayName", geneValues));
                }
            }
            //only one value. we use wildcard to match it
            if (geneValues.length == 1) {
                if (StringUtils.equals("accession", selectedGeneType)) {
                    geneCriteria.add(
                            Restrictions.like("ensgAccession", geneValues[0], MatchMode.ANYWHERE).ignoreCase());
                }
                if (StringUtils.equals("symbol", selectedGeneType)) {
                    geneCriteria
                            .add(Restrictions.like("displayName", geneValues[0], MatchMode.ANYWHERE).ignoreCase());
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    private List<Long> getAllTrafficLight(TLSearchBean tlSearchBean) {

        String chromType = tlSearchBean.getSelectedChromType();
        int token = tlSearchBean.getCombinatedToken();
        long versionId = tlSearchBean.getSelectedVersion();
        boolean chromRegionProvided = tlSearchBean.isRegionProvided();
        boolean geneListProvided = tlSearchBean.isGeneListProvided();

        boolean typeLevelProvided = tlSearchBean.isTypeLevelProvided();

        Criteria tlCriteria = this.session().createCriteria(this.persistClass);

        if (typeLevelProvided) {
            addTypeColorLevelConditions(tlCriteria, tlSearchBean);
        }

        Criteria tlGeneCriteria = tlCriteria.createCriteria("tlGene");

        Criteria tpbVersionCriteria = tlCriteria.createCriteria("tpbVersion");
        tlGeneCriteria.add(Restrictions.eq("chromosome", chromType));

        //chromosome region provided
        if (chromRegionProvided) {
            addChromRegionConditions(tlGeneCriteria, tlSearchBean);
        }

        //gene list provided
        if (geneListProvided) {
            addGeneListConditions(tlGeneCriteria, tlSearchBean);
        }

        //tpb version
        tpbVersionCriteria.add(Restrictions.eq("id", versionId));

        tpbVersionCriteria.add(Restrictions.eq("trackToken", token));
        tlCriteria.setProjection(Projections.property("id"));
        return tlCriteria.list();
    }

    /**
     * {@inheritDoc}
     */
    public TLSumReporter getTLSumReporter(TLSearchBean tlSearchBean) {

        TLSumReporter tlSumReporter = new TLSumReporter();
        String chromType = tlSearchBean.getSelectedChromType();
        tlSumReporter.setChromosome(chromType);

        List<Long> tlIds = getAllTrafficLight(tlSearchBean);
        //PE
        int totalPeLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE, 4);
        int totalPeLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE, 3);
        int totalPeLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE, 2);
        int totalPeLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE, 1);
        TLTypeSumReporter peSumReporter = new TLTypeSumReporter();
        peSumReporter.setLevel4Num(totalPeLevel4);
        peSumReporter.setLevel3Num(totalPeLevel3);
        peSumReporter.setLevel2Num(totalPeLevel2);
        peSumReporter.setLevel1Num(totalPeLevel1);
        peSumReporter.setTpbDataType("PE");
        tlSumReporter.setTLTypeSumReporter(peSumReporter);

        //PE MS
        int totalPeMsLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_MS, 4);
        int totalPeMsLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_MS, 3);
        int totalPeMsLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_MS, 2);
        int totalPeMsLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_MS, 1);
        TLTypeSumReporter peMsSumReporter = new TLTypeSumReporter();
        peMsSumReporter.setLevel4Num(totalPeMsLevel4);
        peMsSumReporter.setLevel3Num(totalPeMsLevel3);
        peMsSumReporter.setLevel2Num(totalPeMsLevel2);
        peMsSumReporter.setLevel1Num(totalPeMsLevel1);
        peMsSumReporter.setTpbDataType("PE MS");
        tlSumReporter.setTLTypeSumReporter(peMsSumReporter);

        //PE MS ANN
        int totalPeMsAnnLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_ANN, 4);
        int totalPeMsAnnLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_ANN, 3);
        int totalPeMsAnnLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_ANN, 2);
        int totalPeMsAnnLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_ANN, 1);
        TLTypeSumReporter peMsAnnSumReporter = new TLTypeSumReporter();
        peMsAnnSumReporter.setLevel4Num(totalPeMsAnnLevel4);
        peMsAnnSumReporter.setLevel3Num(totalPeMsAnnLevel3);
        peMsAnnSumReporter.setLevel2Num(totalPeMsAnnLevel2);
        peMsAnnSumReporter.setLevel1Num(totalPeMsAnnLevel1);
        peMsAnnSumReporter.setTpbDataType("PE MS ANN");
        tlSumReporter.setTLTypeSumReporter(peMsAnnSumReporter);

        //PE MS PROB
        int totalPeMsProbLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_PROB, 4);
        int totalPeMsProbLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_PROB, 3);
        int totalPeMsProbLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_PROB, 2);
        int totalPeMsProbLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_PROB, 1);
        TLTypeSumReporter peMsProbSumReporter = new TLTypeSumReporter();
        peMsProbSumReporter.setLevel4Num(totalPeMsProbLevel4);
        peMsProbSumReporter.setLevel3Num(totalPeMsProbLevel3);
        peMsProbSumReporter.setLevel2Num(totalPeMsProbLevel2);
        peMsProbSumReporter.setLevel1Num(totalPeMsProbLevel1);
        peMsProbSumReporter.setTpbDataType("PE MS PROB");
        tlSumReporter.setTLTypeSumReporter(peMsProbSumReporter);

        //PE MS SAM
        int totalPeMsSamLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_SAM, 4);
        int totalPeMsSamLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_SAM, 3);
        int totalPeMsSamLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_SAM, 2);
        int totalPeMsSamLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_MS_SAM, 1);
        TLTypeSumReporter peMsSamSumReporter = new TLTypeSumReporter();
        peMsSamSumReporter.setLevel4Num(totalPeMsSamLevel4);
        peMsSamSumReporter.setLevel3Num(totalPeMsSamLevel3);
        peMsSamSumReporter.setLevel2Num(totalPeMsSamLevel2);
        peMsSamSumReporter.setLevel1Num(totalPeMsSamLevel1);
        peMsSamSumReporter.setTpbDataType("PE MS SAM");
        tlSumReporter.setTLTypeSumReporter(peMsSamSumReporter);

        //PE ANTI
        int totalPeAntiLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI, 4);
        int totalPeAntiLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI, 3);
        int totalPeAntiLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI, 2);
        int totalPeAntiLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI, 1);
        TLTypeSumReporter peAntiSumReporter = new TLTypeSumReporter();
        peAntiSumReporter.setLevel4Num(totalPeAntiLevel4);
        peAntiSumReporter.setLevel3Num(totalPeAntiLevel3);
        peAntiSumReporter.setLevel2Num(totalPeAntiLevel2);
        peAntiSumReporter.setLevel1Num(totalPeAntiLevel1);
        peAntiSumReporter.setTpbDataType("PE ANTI");
        tlSumReporter.setTLTypeSumReporter(peAntiSumReporter);

        //PE ANTI ANN
        int totalPeAntiAnnLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_ANN, 4);
        int totalPeAntiAnnLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_ANN, 3);
        int totalPeAntiAnnLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_ANN, 2);
        int totalPeAntiAnnLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_ANN, 1);
        TLTypeSumReporter peAntiAnnSumReporter = new TLTypeSumReporter();
        peAntiAnnSumReporter.setLevel4Num(totalPeAntiAnnLevel4);
        peAntiAnnSumReporter.setLevel3Num(totalPeAntiAnnLevel3);
        peAntiAnnSumReporter.setLevel2Num(totalPeAntiAnnLevel2);
        peAntiAnnSumReporter.setLevel1Num(totalPeAntiAnnLevel1);
        peAntiAnnSumReporter.setTpbDataType("PE ANTI ANN");
        tlSumReporter.setTLTypeSumReporter(peAntiAnnSumReporter);

        //PE ANTI IHC
        int totalPeAntiIhcLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC, 4);
        int totalPeAntiIhcLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC, 3);
        int totalPeAntiIhcLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC, 2);
        int totalPeAntiIhcLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC, 1);
        TLTypeSumReporter peAntiIhcSumReporter = new TLTypeSumReporter();
        peAntiIhcSumReporter.setLevel4Num(totalPeAntiIhcLevel4);
        peAntiIhcSumReporter.setLevel3Num(totalPeAntiIhcLevel3);
        peAntiIhcSumReporter.setLevel2Num(totalPeAntiIhcLevel2);
        peAntiIhcSumReporter.setLevel1Num(totalPeAntiIhcLevel1);
        peAntiIhcSumReporter.setTpbDataType("PE ANTI IHC");
        tlSumReporter.setTLTypeSumReporter(peAntiIhcSumReporter);

        //PE ANTI IHC NORM
        int totalPeAntiIhcNormLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC_NORM, 4);
        int totalPeAntiIhcNormLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC_NORM, 3);
        int totalPeAntiIhcNormLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC_NORM, 2);
        int totalPeAntiIhcNormLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_ANTI_IHC_NORM, 1);
        TLTypeSumReporter peAntiIhcNormSumReporter = new TLTypeSumReporter();
        peAntiIhcNormSumReporter.setLevel4Num(totalPeAntiIhcNormLevel4);
        peAntiIhcNormSumReporter.setLevel3Num(totalPeAntiIhcNormLevel3);
        peAntiIhcNormSumReporter.setLevel2Num(totalPeAntiIhcNormLevel2);
        peAntiIhcNormSumReporter.setLevel1Num(totalPeAntiIhcNormLevel1);
        peAntiIhcNormSumReporter.setTpbDataType("PE ANTI IHC NORM");
        tlSumReporter.setTLTypeSumReporter(peAntiIhcNormSumReporter);

        //PE OTH
        int totalPeOthLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH, 4);
        int totalPeOthLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH, 3);
        int totalPeOthLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH, 2);
        int totalPeOthLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH, 1);
        TLTypeSumReporter peOthSumReporter = new TLTypeSumReporter();
        peOthSumReporter.setLevel4Num(totalPeOthLevel4);
        peOthSumReporter.setLevel3Num(totalPeOthLevel3);
        peOthSumReporter.setLevel2Num(totalPeOthLevel2);
        peOthSumReporter.setLevel1Num(totalPeOthLevel1);
        peOthSumReporter.setTpbDataType("PE OTH");
        tlSumReporter.setTLTypeSumReporter(peOthSumReporter);

        //PE OTH CUR
        int totalPeOthCurLevel4 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH_CUR, 4);
        int totalPeOthCurLevel3 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH_CUR, 3);
        int totalPeOthCurLevel2 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH_CUR, 2);
        int totalPeOthCurLevel1 = countEvidenceNumByLevel(tlIds, DataType.PE_OTH_CUR, 1);
        TLTypeSumReporter peOthCurSumReporter = new TLTypeSumReporter();
        peOthCurSumReporter.setLevel4Num(totalPeOthCurLevel4);
        peOthCurSumReporter.setLevel3Num(totalPeOthCurLevel3);
        peOthCurSumReporter.setLevel2Num(totalPeOthCurLevel2);
        peOthCurSumReporter.setLevel1Num(totalPeOthCurLevel1);
        peOthCurSumReporter.setTpbDataType("PE OTH CUR");
        tlSumReporter.setTLTypeSumReporter(peOthCurSumReporter);

        //PTM
        int totalPtmLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM, 4);
        int totalPtmLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM, 3);
        int totalPtmLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM, 2);
        int totalPtmLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM, 1);
        TLTypeSumReporter ptmSumReporter = new TLTypeSumReporter();
        ptmSumReporter.setLevel4Num(totalPtmLevel4);
        ptmSumReporter.setLevel3Num(totalPtmLevel3);
        ptmSumReporter.setLevel2Num(totalPtmLevel2);
        ptmSumReporter.setLevel1Num(totalPtmLevel1);
        ptmSumReporter.setTpbDataType("PTM");
        tlSumReporter.setTLTypeSumReporter(ptmSumReporter);

        //PTM PHS
        int totalPtmPhsLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS, 4);
        int totalPtmPhsLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS, 3);
        int totalPtmPhsLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS, 2);
        int totalPtmPhsLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS, 1);
        TLTypeSumReporter ptmPhsSumReporter = new TLTypeSumReporter();
        ptmPhsSumReporter.setLevel4Num(totalPtmPhsLevel4);
        ptmPhsSumReporter.setLevel3Num(totalPtmPhsLevel3);
        ptmPhsSumReporter.setLevel2Num(totalPtmPhsLevel2);
        ptmPhsSumReporter.setLevel1Num(totalPtmPhsLevel1);
        ptmPhsSumReporter.setTpbDataType("PTM PHS");
        tlSumReporter.setTLTypeSumReporter(ptmPhsSumReporter);

        //PTM PHS SER
        int totalPtmPhsSerLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_SER, 4);
        int totalPtmPhsSerLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_SER, 3);
        int totalPtmPhsSerLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_SER, 2);
        int totalPtmPhsSerLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_SER, 1);
        TLTypeSumReporter ptmPhsSerSumReporter = new TLTypeSumReporter();
        ptmPhsSerSumReporter.setLevel4Num(totalPtmPhsSerLevel4);
        ptmPhsSerSumReporter.setLevel3Num(totalPtmPhsSerLevel3);
        ptmPhsSerSumReporter.setLevel2Num(totalPtmPhsSerLevel2);
        ptmPhsSerSumReporter.setLevel1Num(totalPtmPhsSerLevel1);
        ptmPhsSerSumReporter.setTpbDataType("PTM PHS SER");
        tlSumReporter.setTLTypeSumReporter(ptmPhsSerSumReporter);

        //PTM PHS THR
        int totalPtmPhsThrLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_THR, 4);
        int totalPtmPhsThrLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_THR, 3);
        int totalPtmPhsThrLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_THR, 2);
        int totalPtmPhsThrLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_THR, 1);
        TLTypeSumReporter ptmPhsThrSumReporter = new TLTypeSumReporter();
        ptmPhsThrSumReporter.setLevel4Num(totalPtmPhsThrLevel4);
        ptmPhsThrSumReporter.setLevel3Num(totalPtmPhsThrLevel3);
        ptmPhsThrSumReporter.setLevel2Num(totalPtmPhsThrLevel2);
        ptmPhsThrSumReporter.setLevel1Num(totalPtmPhsThrLevel1);
        ptmPhsThrSumReporter.setTpbDataType("PTM PHS THR");
        tlSumReporter.setTLTypeSumReporter(ptmPhsThrSumReporter);

        //PTM PHS TYR
        int totalPtmPhsTyrLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_TYR, 4);
        int totalPtmPhsTyrLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_TYR, 3);
        int totalPtmPhsTyrLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_TYR, 2);
        int totalPtmPhsTyrLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_PHS_TYR, 1);
        TLTypeSumReporter ptmPhsTyrSumReporter = new TLTypeSumReporter();
        ptmPhsTyrSumReporter.setLevel4Num(totalPtmPhsTyrLevel4);
        ptmPhsTyrSumReporter.setLevel3Num(totalPtmPhsTyrLevel3);
        ptmPhsTyrSumReporter.setLevel2Num(totalPtmPhsTyrLevel2);
        ptmPhsTyrSumReporter.setLevel1Num(totalPtmPhsTyrLevel1);
        ptmPhsTyrSumReporter.setTpbDataType("PTM PHS TYR");
        tlSumReporter.setTLTypeSumReporter(ptmPhsTyrSumReporter);

        //PTM ACE
        int totalPtmAceLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE, 4);
        int totalPtmAceLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE, 3);
        int totalPtmAceLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE, 2);
        int totalPtmAceLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE, 1);
        TLTypeSumReporter ptmAceSumReporter = new TLTypeSumReporter();
        ptmAceSumReporter.setLevel4Num(totalPtmAceLevel4);
        ptmAceSumReporter.setLevel3Num(totalPtmAceLevel3);
        ptmAceSumReporter.setLevel2Num(totalPtmAceLevel2);
        ptmAceSumReporter.setLevel1Num(totalPtmAceLevel1);
        ptmAceSumReporter.setTpbDataType("PTM ACE");
        tlSumReporter.setTLTypeSumReporter(ptmAceSumReporter);

        //PTM ACE LYS
        int totalPtmAceLysLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_LYS, 4);
        int totalPtmAceLysLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_LYS, 3);
        int totalPtmAceLysLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_LYS, 2);
        int totalPtmAceLysLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_LYS, 1);
        TLTypeSumReporter ptmAceLysSumReporter = new TLTypeSumReporter();
        ptmAceLysSumReporter.setLevel4Num(totalPtmAceLysLevel4);
        ptmAceLysSumReporter.setLevel3Num(totalPtmAceLysLevel3);
        ptmAceLysSumReporter.setLevel2Num(totalPtmAceLysLevel2);
        ptmAceLysSumReporter.setLevel1Num(totalPtmAceLysLevel1);
        ptmAceLysSumReporter.setTpbDataType("PTM ACE LYS");
        tlSumReporter.setTLTypeSumReporter(ptmAceLysSumReporter);

        //PTM ACE NTA
        int totalPtmAceNtaLevel4 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_NTA, 4);
        int totalPtmAceNtaLevel3 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_NTA, 3);
        int totalPtmAceNtaLevel2 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_NTA, 2);
        int totalPtmAceNtaLevel1 = countEvidenceNumByLevel(tlIds, DataType.PTM_ACE_NTA, 1);
        TLTypeSumReporter ptmAceNtaSumReporter = new TLTypeSumReporter();
        ptmAceNtaSumReporter.setLevel4Num(totalPtmAceNtaLevel4);
        ptmAceNtaSumReporter.setLevel3Num(totalPtmAceNtaLevel3);
        ptmAceNtaSumReporter.setLevel2Num(totalPtmAceNtaLevel2);
        ptmAceNtaSumReporter.setLevel1Num(totalPtmAceNtaLevel1);
        ptmAceNtaSumReporter.setTpbDataType("PTM PHS THR");
        tlSumReporter.setTLTypeSumReporter(ptmAceNtaSumReporter);

        //TE
        int totalTeLevel4 = countEvidenceNumByLevel(tlIds, DataType.TE, 4);
        int totalTeLevel3 = countEvidenceNumByLevel(tlIds, DataType.TE, 3);
        int totalTeLevel2 = countEvidenceNumByLevel(tlIds, DataType.TE, 2);
        int totalTeLevel1 = countEvidenceNumByLevel(tlIds, DataType.TE, 1);
        TLTypeSumReporter teSumReporter = new TLTypeSumReporter();
        teSumReporter.setLevel4Num(totalTeLevel4);
        teSumReporter.setLevel3Num(totalTeLevel3);
        teSumReporter.setLevel2Num(totalTeLevel2);
        teSumReporter.setLevel1Num(totalTeLevel1);
        teSumReporter.setTpbDataType("TE");
        tlSumReporter.setTLTypeSumReporter(teSumReporter);

        //TE MA
        int totalTeMaLevel4 = countEvidenceNumByLevel(tlIds, DataType.TE_MA, 4);
        int totalTeMaLevel3 = countEvidenceNumByLevel(tlIds, DataType.TE_MA, 3);
        int totalTeMaLevel2 = countEvidenceNumByLevel(tlIds, DataType.TE_MA, 2);
        int totalTeMaLevel1 = countEvidenceNumByLevel(tlIds, DataType.TE_MA, 1);
        TLTypeSumReporter teMaSumReporter = new TLTypeSumReporter();
        teMaSumReporter.setLevel4Num(totalTeMaLevel4);
        teMaSumReporter.setLevel3Num(totalTeMaLevel3);
        teMaSumReporter.setLevel2Num(totalTeMaLevel2);
        teMaSumReporter.setLevel1Num(totalTeMaLevel1);
        teMaSumReporter.setTpbDataType("TE MA");
        tlSumReporter.setTLTypeSumReporter(teMaSumReporter);

        //TE MA PROP
        int totalTeMaPropLevel4 = countEvidenceNumByLevel(tlIds, DataType.TE_MA_PROP, 4);
        int totalTeMaPropLevel3 = countEvidenceNumByLevel(tlIds, DataType.TE_MA_PROP, 3);
        int totalTeMaPropLevel2 = countEvidenceNumByLevel(tlIds, DataType.TE_MA_PROP, 2);
        int totalTeMaPropLevel1 = countEvidenceNumByLevel(tlIds, DataType.TE_MA_PROP, 1);
        TLTypeSumReporter teMaPropSumReporter = new TLTypeSumReporter();
        teMaPropSumReporter.setLevel4Num(totalTeMaPropLevel4);
        teMaPropSumReporter.setLevel3Num(totalTeMaPropLevel3);
        teMaPropSumReporter.setLevel2Num(totalTeMaPropLevel2);
        teMaPropSumReporter.setLevel1Num(totalTeMaPropLevel1);
        teMaPropSumReporter.setTpbDataType("TE MA PROP");
        tlSumReporter.setTLTypeSumReporter(teMaPropSumReporter);

        //TE OTH
        int totalTeOthLevel4 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH, 4);
        int totalTeOthLevel3 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH, 3);
        int totalTeOthLevel2 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH, 2);
        int totalTeOthLevel1 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH, 1);
        TLTypeSumReporter teOthSumReporter = new TLTypeSumReporter();
        teOthSumReporter.setLevel4Num(totalTeOthLevel4);
        teOthSumReporter.setLevel3Num(totalTeOthLevel3);
        teOthSumReporter.setLevel2Num(totalTeOthLevel2);
        teOthSumReporter.setLevel1Num(totalTeOthLevel1);
        teOthSumReporter.setTpbDataType("TE OTH");
        tlSumReporter.setTLTypeSumReporter(teOthSumReporter);

        //TE OTH CUR
        int totalTeOthCurLevel4 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH_CUR, 4);
        int totalTeOthCurLevel3 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH_CUR, 3);
        int totalTeOthCurLevel2 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH_CUR, 2);
        int totalTeOthCurLevel1 = countEvidenceNumByLevel(tlIds, DataType.TE_OTH_CUR, 1);
        TLTypeSumReporter teOthCurSumReporter = new TLTypeSumReporter();
        teOthCurSumReporter.setLevel4Num(totalTeOthCurLevel4);
        teOthCurSumReporter.setLevel3Num(totalTeOthCurLevel3);
        teOthCurSumReporter.setLevel2Num(totalTeOthCurLevel2);
        teOthCurSumReporter.setLevel1Num(totalTeOthCurLevel1);
        teOthCurSumReporter.setTpbDataType("TE OTH CUR");
        tlSumReporter.setTLTypeSumReporter(teOthCurSumReporter);

        return tlSumReporter;
    }

    private int countEvidenceNumByLevel(List<Long> tlIds, DataType dataType, int level) {
        Criteria tlCrt = this.session().createCriteria(this.persistClass);
        tlCrt.add(Restrictions.in("id", tlIds));
        String tlColor = null;

        //PE
        if (DataType.PE.equals(dataType)) {
            tlColor = "tlPEColor";
        }
        if (DataType.PE_MS.equals(dataType)) {
            tlColor = "tlPEMSColor";
        }
        if (DataType.PE_MS_ANN.equals(dataType)) {
            tlColor = "tlPEMSANNColor";
        }
        if (DataType.PE_MS_PROB.equals(dataType)) {
            tlColor = "tlPEMSPROBColor";
        }
        if (DataType.PE_MS_SAM.equals(dataType)) {
            tlColor = "tlPEMSSAMColor";
        }
        if (DataType.PE_ANTI.equals(dataType)) {
            tlColor = "tlPEANTIColor";
        }
        if (DataType.PE_ANTI_ANN.equals(dataType)) {
            tlColor = "tlPEANTIANNColor";
        }
        if (DataType.PE_ANTI_IHC.equals(dataType)) {
            tlColor = "tlPEANTIIHCColor";
        }
        if (DataType.PE_ANTI_IHC_NORM.equals(dataType)) {
            tlColor = "tlPEANTIIHCNORMColor";
        }
        if (DataType.PE_OTH.equals(dataType)) {
            tlColor = "tlPEOTHColor";
        }
        if (DataType.PE_OTH_CUR.equals(dataType)) {
            tlColor = "tlPEOTHCURColor";
        }
        //PTM
        if (DataType.PTM.equals(dataType)) {
            tlColor = "tlPTMColor";
        }
        if (DataType.PTM_PHS.equals(dataType)) {
            tlColor = "tlPTMPHSColor";
        }
        if (DataType.PTM_PHS_SER.equals(dataType)) {
            tlColor = "tlPTMPHSSERColor";
        }
        if (DataType.PTM_PHS_THR.equals(dataType)) {
            tlColor = "tlPTMPHSTHRColor";
        }
        if (DataType.PTM_PHS_TYR.equals(dataType)) {
            tlColor = "tlPTMPHSTYRColor";
        }
        if (DataType.PTM_ACE.equals(dataType)) {
            tlColor = "tlPTMACEColor";
        }
        if (DataType.PTM_ACE_LYS.equals(dataType)) {
            tlColor = "tlPTMACELYSColor";
        }
        if (DataType.PTM_ACE_NTA.equals(dataType)) {
            tlColor = "tlPTMACENTAColor";
        }

        //TE
        if (DataType.TE.equals(dataType)) {
            tlColor = "tlTEColor";
        }
        //TE MA
        if (DataType.TE_MA.equals(dataType)) {
            tlColor = "tlTEMAColor";
        }
        //TE MA PROP
        if (DataType.TE_MA_PROP.equals(dataType)) {
            tlColor = "tlTEMAPROPColor";
        }
        //TE OTH
        if (DataType.TE_OTH.equals(dataType)) {
            tlColor = "tlTEOTHColor";
        }
        //TE OTH CUR
        if (DataType.TE_OTH_CUR.equals(dataType)) {
            tlColor = "tlTEOTHCURColor";
        }

        Criteria levelCriteria = tlCrt.createCriteria(tlColor);
        levelCriteria.add((Restrictions.eq("colorLevel", level)));
        tlCrt.setProjection(Projections.rowCount());
        return ((Long) tlCrt.uniqueResult()).intValue();
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<TrafficLight> getTrafficLightsByChromAndTPBVersion(ChromType chromType, TPBVersion tpbVersion) {
        Criteria tlQCriteria = this.session().createCriteria(this.persistClass);
        Criteria tlgQCriteria = tlQCriteria.createCriteria("tlGene");
        Criteria tpbVQCriteria = tlQCriteria.createCriteria("tpbVersion");
        tlgQCriteria.add(Restrictions.eq("chromosome", chromType.chm()));
        tpbVQCriteria.add(Restrictions.eq("id", tpbVersion.getId()));
        tpbVQCriteria.add(Restrictions.eq("trackToken", tpbVersion.getTrackToken()));
        return tlQCriteria.list();
    }
}