edu.harvard.i2b2.crc.ejb.PdoQueryBean.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.crc.ejb.PdoQueryBean.java

Source

/*
 * Copyright (c) 2006-2007 Massachusetts General Hospital 
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the i2b2 Software License v1.0 
 * which accompanies this distribution. 
 * 
 * Contributors: 
 *     Rajesh Kuttan
 */
package edu.harvard.i2b2.crc.ejb;

import java.io.StringWriter;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//import javax.ejb.CreateException;
//import javax.ejb.EJBException;
//import javax.ejb.SessionBean;
//import javax.ejb.SessionContext;
import javax.xml.bind.JAXBElement;
import javax.xml.stream.XMLStreamException;

import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import edu.harvard.i2b2.common.exception.I2B2DAOException;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.common.exception.StackTraceUtil;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtil;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.crc.dao.DAOFactoryHelper;
import edu.harvard.i2b2.crc.dao.IDAOFactory;
import edu.harvard.i2b2.crc.dao.PatientDataDAOFactory;
import edu.harvard.i2b2.crc.dao.pdo.DimensionTable;
import edu.harvard.i2b2.crc.dao.pdo.IMetadataDao;
import edu.harvard.i2b2.crc.dao.pdo.IObservationFactDao;
import edu.harvard.i2b2.crc.dao.pdo.MetaDataTypeMapper;
import edu.harvard.i2b2.crc.dao.pdo.MetadataDao;
import edu.harvard.i2b2.crc.dao.pdo.MetadataDao.TableMetaData;
import edu.harvard.i2b2.crc.dao.pdo.PdoQueryHandler;
import edu.harvard.i2b2.crc.dao.pdo.input.IInputOptionListHandler;
import edu.harvard.i2b2.crc.dao.pdo.input.OutputOptionFactRelatedHelper;
import edu.harvard.i2b2.crc.dao.pdo.input.PDOFactory;
import edu.harvard.i2b2.crc.dao.pdo.input.PagingHandler;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryPdoMasterDao;
import edu.harvard.i2b2.crc.dao.setfinder.querybuilder.ItemMetaDataHandler;
import edu.harvard.i2b2.crc.datavo.CRCJAXBUtil;
import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup;
import edu.harvard.i2b2.crc.datavo.db.QtQueryMaster;
import edu.harvard.i2b2.crc.datavo.i2b2message.PasswordType;
import edu.harvard.i2b2.crc.datavo.i2b2message.RequestMessageType;
import edu.harvard.i2b2.crc.datavo.i2b2message.SecurityType;
import edu.harvard.i2b2.crc.datavo.ontology.ConceptType;
import edu.harvard.i2b2.crc.datavo.ontology.ModifierType;
import edu.harvard.i2b2.crc.datavo.ontology.XmlValueType;
import edu.harvard.i2b2.crc.datavo.pdo.ParamType;
import edu.harvard.i2b2.crc.datavo.pdo.PatientDataType;
import edu.harvard.i2b2.crc.datavo.pdo.query.FilterListType;
import edu.harvard.i2b2.crc.datavo.pdo.query.GetObservationFactByPrimaryKeyRequestType;
import edu.harvard.i2b2.crc.datavo.pdo.query.GetPDOFromInputListRequestType;
import edu.harvard.i2b2.crc.datavo.pdo.query.InputOptionListType;
import edu.harvard.i2b2.crc.datavo.pdo.query.ItemType;
import edu.harvard.i2b2.crc.datavo.pdo.query.MetadataxmlValueType;
import edu.harvard.i2b2.crc.datavo.pdo.query.OutputOptionNameType;
import edu.harvard.i2b2.crc.datavo.pdo.query.PageByPatientType;
import edu.harvard.i2b2.crc.datavo.pdo.query.PageRangeType;
import edu.harvard.i2b2.crc.datavo.pdo.query.PageType;
import edu.harvard.i2b2.crc.datavo.pdo.query.PanelType;
import edu.harvard.i2b2.crc.datavo.pdo.query.PatientDataResponseType;
import edu.harvard.i2b2.crc.datavo.pdo.query.RangeType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryDefinitionType;
import edu.harvard.i2b2.crc.delegate.ontology.CallOntologyUtil;
import edu.harvard.i2b2.crc.role.AuthrizationHelper;
import edu.harvard.i2b2.crc.util.I2B2RequestMessageHelper;
import edu.harvard.i2b2.crc.util.PMServiceAccountUtil;
import edu.harvard.i2b2.crc.util.ParamUtil;
import edu.harvard.i2b2.crc.util.QueryProcessorUtil;

/**
 * This is the PDO Query ejb class. It passes pdo query request's to the
 * appropriate dao classes to get response in pdo format.
 * 
 * @ejb.bean description="Patient data Query bean"
 *           display-name="Patient data Query"
 *           jndi-name="ejb.querytool.PdoQuery"
 *           local-jndi-name="ejb.querytool.PdoQueryLocal"
 *           name="querytool.PdoQuery" type="Stateless" view-type="both"
 *           transaction-type="Container"
 * 
 * @ejb.interface remote-class="edu.harvard.i2b2.crc.ejb.PdoQueryRemote"
 * 
 * @author rkuttan
 */
public class PdoQueryBean { //implements SessionBean {
    // RunQuery
    /** log **/
    protected final Log log = LogFactory.getLog(getClass());

    /**
     * Function to get plain pdo from the given pdo request
     * 
     * @ejb.interface-method view-type="both"
     * @ejb.transaction type="Required"
     */
    public PatientDataResponseType getPlainPatientData(DataSourceLookup dataSourceLookup,
            GetPDOFromInputListRequestType getPDOFromInputListReqType, String requestXml) throws I2B2Exception {
        PatientDataType patientDataType = null;

        DAOFactoryHelper helper = new DAOFactoryHelper(dataSourceLookup.getDomainId(),
                dataSourceLookup.getProjectPath(), dataSourceLookup.getOwnerId());
        IDAOFactory daoFactory = helper.getDAOFactory();

        IQueryPdoMasterDao queryPdoMasterDao = daoFactory.getSetFinderDAOFactory().getQueryPdoMasterDAO();

        savePdoQueryMaster(queryPdoMasterDao, requestXml);

        String version = getVersion(queryPdoMasterDao, requestXml);
        // check if the user have the blob permission
        boolean blobFlag = checkForBlob(getPDOFromInputListReqType);
        if (blobFlag) {
            //
            String domainId = dataSourceLookup.getDomainId();
            String projectId = dataSourceLookup.getProjectPath();
            String userId = dataSourceLookup.getOwnerId();
            daoFactory = helper.getDAOFactory();
            AuthrizationHelper authHelper = new AuthrizationHelper(domainId, projectId, userId, daoFactory);
            authHelper.checkRoleForProtectionLabel("PDO_WITH_BLOB");
        }

        // get unit cd conversion project param from cache 
        ParamUtil paramUtil = new ParamUtil();
        DataSourceLookup origDataSourceLookup = daoFactory.getPatientDataDAOFactory().getOriginalDataSourceLookup();
        String unitCdConversionParam = paramUtil.getParam(origDataSourceLookup.getProjectPath(),
                origDataSourceLookup.getOwnerId(), origDataSourceLookup.getDomainId(),
                ParamUtil.CRC_ENABLE_UNITCD_CONVERSION);

        Map projectParamMap = null;
        if (unitCdConversionParam != null) {
            projectParamMap = new HashMap();
            projectParamMap.put(ParamUtil.CRC_ENABLE_UNITCD_CONVERSION, unitCdConversionParam.trim());

        }

        // call ontology cell to get the item's metadata to build the query sql
        FilterListType filterList = getPDOFromInputListReqType.getFilterList();
        Map<String, XmlValueType> modifierMetadataXmlMap = new HashMap<String, XmlValueType>();
        if (filterList != null) {
            try {
                //CallOntologyUtil ontologyUtil = new CallOntologyUtil(requestXml);

                JAXBElement responseJaxb = CRCJAXBUtil.getJAXBUtil().unMashallFromString(requestXml);
                RequestMessageType request = (RequestMessageType) responseJaxb.getValue();
                String projectId = request.getMessageHeader().getProjectId();
                SecurityType tempSecurityType = request.getMessageHeader().getSecurity();
                SecurityType securityType = PMServiceAccountUtil
                        .getServiceSecurityType(tempSecurityType.getDomain());

                // if regular concepts
                for (PanelType panel : filterList.getPanel()) {
                    for (ItemType item : panel.getItem()) {
                        //ConceptType conceptType = ontologyUtil.callOntology(item.getItemKey());
                        ConceptType conceptType = CallOntologyUtil.callOntology(item.getItemKey(), securityType,
                                projectId, QueryProcessorUtil.getInstance().getOntologyUrl());

                        log.debug("fetching the metadata information from ontology [" + item.getItemKey() + "]");
                        if (conceptType != null) {
                            item.setDimDimcode(conceptType.getDimcode());
                            item.setDimColumnname(conceptType.getColumnname());
                            item.setDimOperator(conceptType.getOperator());
                            item.setDimTablename(conceptType.getTablename());
                            item.setFacttablecolumn(conceptType.getFacttablecolumn());
                            item.setDimColumndatatype(conceptType.getColumndatatype());

                            if (conceptType.getMetadataxml() != null
                                    && conceptType.getMetadataxml().getAny().get(0) != null) {
                                MetadataxmlValueType metadataXmlType = new MetadataxmlValueType();
                                metadataXmlType.getContent().add(conceptType.getMetadataxml().getAny().get(0));
                                item.setMetadataxml(metadataXmlType);
                            }

                            log.debug("metadata from ontology received for [" + item.getItemKey() + "]"
                                    + conceptType.getTablename());

                            //check for modifier constrain and get modifier metadata
                            ItemType.ConstrainByModifier modifierConstrain = item.getConstrainByModifier();
                            if (modifierConstrain != null) {
                                ItemMetaDataHandler itemMetaDataHandler = new ItemMetaDataHandler(requestXml);
                                String modifierKey = modifierConstrain.getModifierKey();
                                String modifierAppliedPath = modifierConstrain.getAppliedPath();
                                ModifierType modifierType = itemMetaDataHandler.getModifierDataFromOntologyCell(
                                        modifierKey, modifierAppliedPath,
                                        helper.getDataSourceLookup().getServerType());
                                copyModifierToItem(item, modifierType);

                                //cache the modifier metadat in the map
                                if (projectParamMap != null) {
                                    String unitConversionFlag = (String) projectParamMap
                                            .get(ParamUtil.CRC_ENABLE_UNITCD_CONVERSION);
                                    if (unitConversionFlag != null && unitConversionFlag.equals("ON")) {
                                        if (modifierType.getMetadataxml() != null) {
                                            log.debug("Adding modifier metadata xml to lookup map for modifier key"
                                                    + modifierType.getKey() + modifierType.getAppliedPath());
                                            modifierMetadataXmlMap.put(
                                                    modifierType.getKey() + modifierType.getAppliedPath(),
                                                    modifierType.getMetadataxml());
                                        }
                                    }
                                }
                            }

                        } else {
                            log.debug(
                                    "Unable to get item's metadata from ontology cell [" + item.getItemKey() + "]");
                        }
                    }
                }
            } catch (JAXBUtilException jaxEx) {
                jaxEx.printStackTrace();
                throw new I2B2Exception(
                        "Error in getting item's metadata from the ontology : " + jaxEx.getMessage(), jaxEx);
            } catch (AxisFault e) {
                e.printStackTrace();
                throw new I2B2Exception("Error in getting item's metadata from the ontology : " + e.getMessage(),
                        e);
            } catch (XMLStreamException e) {
                e.printStackTrace();
                throw new I2B2Exception("Error in getting item's metadata from the ontology : " + e.getMessage(),
                        e);
            }
        }

        PatientDataDAOFactory pdoDaoFactory = daoFactory.getPatientDataDAOFactory();

        PatientDataResponseType patientDataResponseType = new PatientDataResponseType();
        try {
            OutputOptionNameType ot = getPDOFromInputListReqType.getOutputOption().getNames();

            QueryProcessorUtil qpUtil = QueryProcessorUtil.getInstance();
            String pageMethod = qpUtil.getPagingMethod();
            log.debug("PageMethod value [" + pageMethod + "]");

            InputOptionListType origInputList = getPDOFromInputListReqType.getInputList();
            InputOptionListType inputList = getPDOFromInputListReqType.getInputList();
            IInputOptionListHandler inputListHandler = PDOFactory.buildInputListHandler(inputList,
                    helper.getDataSourceLookup());

            int requestedMinIndex = inputListHandler.getMinIndex();
            int requestedMaxIndex = inputListHandler.getMaxIndex();
            // if the request missing the max index, then default the maxindex
            // to size of the input list
            if (requestedMaxIndex < 1) {
                requestedMaxIndex = inputListHandler.getInputSize();
                RangeType rangeType = PDOFactory.getRangeType(inputList);
                rangeType.setMax(requestedMaxIndex);
            }

            // before doing the paging, check if the output option list has
            // observaion
            OutputOptionFactRelatedHelper opFactRelatedHelper = new OutputOptionFactRelatedHelper(
                    getPDOFromInputListReqType.getOutputOption());
            boolean pagingNeeded = opFactRelatedHelper.isFactRelated();
            if (pagingNeeded) {
                PagingHandler ph = new PagingHandler(helper, getPDOFromInputListReqType.getInputList(),
                        getPDOFromInputListReqType.getFilterList(), pageMethod);
                ph.setProjectParamMap(projectParamMap);
                ph.setModifierMetadataXmlMap(modifierMetadataXmlMap);
                HashMap calculatedValueMap = ph.calculateMaxPageInputList();

                // do paging if required
                if ((Boolean) calculatedValueMap.get(PagingHandler.PAGING_REQUIRED_FLAG)) {

                    long totalSize = (Long) calculatedValueMap.get(PagingHandler.TOTAL_OBSERVATION);
                    int maxInputSize = (Integer) calculatedValueMap.get(PagingHandler.MAX_INPUT_LIST);
                    long pageSize = ph.getPageSize();

                    // build page type
                    PageType pageType = buildPageType(requestedMinIndex, requestedMaxIndex, maxInputSize, totalSize,
                            pageSize);
                    patientDataResponseType.setPage(pageType);

                    RangeType rangeType = PDOFactory.getRangeType(inputList);
                    rangeType.setMax(requestedMinIndex + maxInputSize - 1);

                    // inputList.getPatientList().setMax(
                    // requestedMinIndex + maxInputSize);
                }
            }
            boolean tablePDO = false;
            if (getPDOFromInputListReqType.getOutputOption().getNames() != null) {
                if (getPDOFromInputListReqType.getOutputOption().getNames().name()
                        .equalsIgnoreCase(OutputOptionNameType.ASATTRIBUTES.name())) {
                    tablePDO = true;
                }
            }
            log.debug("PDO reading metadat for patient_dimension table");
            //get patient dimension metadata
            List<ParamType> patientMetaDataList = getPDOTemplate("patient_dimension", dataSourceLookup, tablePDO);
            //get visit dimension metadata
            log.debug("PDO reading metadat for visit_dimension table");
            List<ParamType> visitMetaDataList = getPDOTemplate("visit_dimension", dataSourceLookup, tablePDO);

            if ((ot != null) && ot.name().equalsIgnoreCase(OutputOptionNameType.ASATTRIBUTES.name())) {
                PdoQueryHandler pdoQueryHandler = new PdoQueryHandler(pdoDaoFactory, PdoQueryHandler.TABLE_PDO_TYPE,
                        origInputList, inputList, // /getPDOFromInputListReqType.getInputList(),
                        getPDOFromInputListReqType.getFilterList(), getPDOFromInputListReqType.getOutputOption());
                pdoQueryHandler.setProjectParamMap(projectParamMap);
                pdoQueryHandler.setModifierMetadataXmlMap(modifierMetadataXmlMap);
                pdoQueryHandler.setRequestVersion(version);
                pdoQueryHandler.setDimensionMetaDataParamList(patientMetaDataList, visitMetaDataList);
                pdoQueryHandler.processPDORequest();
                patientDataType = pdoQueryHandler.getTablePdo();
            } else {
                PdoQueryHandler pdoQueryHandler = new PdoQueryHandler(pdoDaoFactory, PdoQueryHandler.PLAIN_PDO_TYPE,
                        origInputList, inputList, // getPDOFromInputListReqType.getInputList(),
                        getPDOFromInputListReqType.getFilterList(), getPDOFromInputListReqType.getOutputOption());
                pdoQueryHandler.setProjectParamMap(projectParamMap);
                pdoQueryHandler.setModifierMetadataXmlMap(modifierMetadataXmlMap);
                pdoQueryHandler.setRequestVersion(version);
                pdoQueryHandler.setDimensionMetaDataParamList(patientMetaDataList, visitMetaDataList);
                pdoQueryHandler.processPDORequest();
                patientDataType = pdoQueryHandler.getPlainPdo();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            log.error(ex.getMessage(), ex);
            throw new I2B2Exception(ex.getMessage(), ex);
        }
        patientDataResponseType.setPatientData(patientDataType);

        return patientDataResponseType;
    }

    /**
     * Function to get plain pdo from the given pdo request
     * 
     * @ejb.interface-method view-type="both"
     * @ejb.transaction type="Required"
     */
    public List<ParamType> getPDOTemplate(String dimensionTableName, DataSourceLookup dataSourceLookup,
            boolean tablePDOFlag) throws I2B2Exception {

        List<ParamType> paramList = new ArrayList<ParamType>();

        DAOFactoryHelper helper = new DAOFactoryHelper(dataSourceLookup.getDomainId(),
                dataSourceLookup.getProjectPath(), dataSourceLookup.getOwnerId());
        IDAOFactory daoFactory = helper.getDAOFactory();

        //
        MetaDataTypeMapper metaDataTypeMapper = new MetaDataTypeMapper();
        IMetadataDao metadataDao = daoFactory.getPatientDataDAOFactory().getMetadataDAO();
        try {
            Map optionalFieldMap = metadataDao.getMetadataForOptionalField(dimensionTableName);
            MetadataDao.TableMetaData[] tableMetaDataList = (TableMetaData[]) optionalFieldMap.values()
                    .toArray(new MetadataDao.TableMetaData[] {});
            metaDataTypeMapper.fillXmlDataType(tableMetaDataList, tablePDOFlag);
            for (int i = 0; i < tableMetaDataList.length; i++) {
                ParamType paramType = new ParamType();
                paramType.setColumn(tableMetaDataList[i].column_name);
                paramType.setColumnDescriptor(tableMetaDataList[i].column_comment);
                paramType.setType(tableMetaDataList[i].column_xml_type);
                paramList.add(paramType);

            }

        } catch (Exception i2b2DaoEx) {
            i2b2DaoEx.printStackTrace();
            throw new I2B2Exception(i2b2DaoEx.getMessage(), i2b2DaoEx);
        }

        return paramList;
    }

    private PageType buildPageType(int requestedMinIndex, int requestedMaxIndex, int maxInputIndex, long totalSize,
            long pageSize) {
        PageType pageType = new PageType();
        PageByPatientType pageByPatientType = new PageByPatientType();
        pageByPatientType.setPageSize(pageSize);
        pageByPatientType.setFactsTotal(totalSize);

        PageRangeType requestedPageRangeType = new PageRangeType();
        requestedPageRangeType.setFirstIndex(requestedMinIndex);
        requestedPageRangeType.setLastIndex(requestedMaxIndex);
        pageByPatientType.setPatientsRequested(requestedPageRangeType);

        PageRangeType returnedPageRangeType = new PageRangeType();
        returnedPageRangeType.setFirstIndex(requestedMinIndex);
        int maxReturnedIndex = requestedMinIndex + maxInputIndex - 1;
        returnedPageRangeType.setLastIndex(maxReturnedIndex);
        pageByPatientType.setPatientsReturned(returnedPageRangeType);

        PageRangeType skippedPageRangeType = new PageRangeType();
        skippedPageRangeType.setFirstIndex(0);
        skippedPageRangeType.setLastIndex(requestedMinIndex);
        pageByPatientType.setPatientsSkipped(skippedPageRangeType);

        pageType.setPagingByPatients(pageByPatientType);
        return pageType;
    }

    /**
     * Function to get observation fact by its primary key
     * 
     * @ejb.interface-method view-type="both"
     * @ejb.transaction type="Required"
     */
    public PatientDataType getObservationFactByPrimaryKey(DataSourceLookup dataSourceLookup,
            GetObservationFactByPrimaryKeyRequestType getObservationFactByPrimaryKeyRequestType)
            throws I2B2Exception {
        PatientDataType patientDataType = null;

        try {

            PatientDataDAOFactory pdoDaoFactory = getPatientDataDaoFactory(dataSourceLookup.getDomainId(),
                    dataSourceLookup.getProjectPath(), dataSourceLookup.getOwnerId());

            IObservationFactDao observationFactDao = pdoDaoFactory.getObservationFactDAO();
            patientDataType = observationFactDao.getObservationFactByPrimaryKey(
                    getObservationFactByPrimaryKeyRequestType.getFactPrimaryKey(),
                    getObservationFactByPrimaryKeyRequestType.getFactOutputOption());
        } catch (I2B2DAOException ex) {
            ex.printStackTrace();
            log.error(ex.getMessage(), ex);
            throw new I2B2Exception(ex.getMessage(), ex);
        }

        return patientDataType;
    }

    private PatientDataDAOFactory getPatientDataDaoFactory(String domainId, String projectPath, String ownerId)
            throws I2B2DAOException {
        DAOFactoryHelper helper = new DAOFactoryHelper(domainId, projectPath, ownerId);
        PatientDataDAOFactory pdoDaoFactory = helper.getDAOFactory().getPatientDataDAOFactory();
        return pdoDaoFactory;
    }

    private boolean checkForBlob(GetPDOFromInputListRequestType getPDOFromInputListReqType) {
        boolean booleanConcept = true, booleanEid = true, booleanEvent = true, booleanObservation = true,
                booleanObserver = true, booleanPatient = true;
        boolean booleanPid = true;

        if (getPDOFromInputListReqType.getOutputOption().getConceptSetUsingFilterList() != null) {
            booleanConcept = getPDOFromInputListReqType.getOutputOption().getConceptSetUsingFilterList().isBlob();
            if (booleanConcept) {
                booleanConcept = false;
            } else {
                booleanConcept = true;
            }
        }
        if (getPDOFromInputListReqType.getOutputOption().getEidSet() != null) {
            booleanEid = getPDOFromInputListReqType.getOutputOption().getEidSet().isBlob();
            if (booleanEid) {
                booleanEid = false;
            } else {
                booleanEid = true;
            }

        }
        if (getPDOFromInputListReqType.getOutputOption().getEventSet() != null) {
            booleanEvent = getPDOFromInputListReqType.getOutputOption().getEventSet().isBlob();
            if (booleanEvent) {
                booleanEvent = false;
            } else {
                booleanEvent = true;
            }
        }
        if (getPDOFromInputListReqType.getOutputOption().getObservationSet() != null) {
            booleanObservation = getPDOFromInputListReqType.getOutputOption().getObservationSet().isBlob();
            if (booleanObservation) {
                booleanObservation = false;
            } else {
                booleanObservation = true;
            }
        }
        if (getPDOFromInputListReqType.getOutputOption().getObserverSetUsingFilterList() != null) {
            booleanObserver = getPDOFromInputListReqType.getOutputOption().getObserverSetUsingFilterList().isBlob();
            if (booleanObserver) {
                booleanObserver = false;
            } else {
                booleanObserver = true;
            }
        }

        if (getPDOFromInputListReqType.getOutputOption().getPatientSet() != null) {
            booleanPatient = getPDOFromInputListReqType.getOutputOption().getPatientSet().isBlob();
            if (booleanPatient) {
                booleanPatient = false;
            } else {
                booleanPatient = true;
            }
        }

        if (getPDOFromInputListReqType.getOutputOption().getPidSet() != null) {
            booleanPid = getPDOFromInputListReqType.getOutputOption().getPidSet().isBlob();
            if (booleanPid) {
                booleanPid = false;
            } else {
                booleanPid = true;
            }
        }
        if (booleanConcept && booleanEid && booleanEvent && booleanObservation && booleanObserver && booleanPatient
                && booleanPid) {
            return false;
        } else {
            return true;
        }

    }

    private void savePdoQueryMaster(IQueryPdoMasterDao queryPdoMasterDao, String requestXml) throws I2B2Exception {
        QtQueryMaster queryMaster = new QtQueryMaster();

        I2B2RequestMessageHelper requestMessageHelper = new I2B2RequestMessageHelper(requestXml);

        SecurityType securityType = requestMessageHelper.getSecurityType();
        String userId = securityType.getUsername();
        String groupId = requestMessageHelper.getProjectId();

        QueryDefinitionType queryDefType = null;
        try {
            queryDefType = requestMessageHelper.getQueryDefinition();
        } catch (JAXBUtilException e) {
            throw new I2B2Exception("Error reading the query definition [" + StackTraceUtil.getStackTrace(e) + "]");
        }
        edu.harvard.i2b2.crc.datavo.setfinder.query.ObjectFactory of = new edu.harvard.i2b2.crc.datavo.setfinder.query.ObjectFactory();

        queryMaster.setUserId(userId);
        StringWriter queryDefWriter = new StringWriter();
        try {
            CRCJAXBUtil.getQueryDefJAXBUtil().marshaller(of.createQueryDefinition(queryDefType), queryDefWriter);
        } catch (JAXBUtilException e) {
            throw new I2B2Exception(
                    "Error marshalling the query definition [" + StackTraceUtil.getStackTrace(e) + "]");
        }

        queryMaster.setRequestXml(queryDefWriter.toString());
        queryMaster.setGroupId(groupId);
        queryMaster.setCreateDate(new Date(System.currentTimeMillis()));
        queryMaster.setI2b2RequestXml(requestXml);
        queryMaster.setRequestXml(requestXml);

        //remove user password from the request
        RequestMessageType i2b2RequestMsgType = requestMessageHelper.getI2B2RequestMessageType();
        PasswordType passType = i2b2RequestMsgType.getMessageHeader().getSecurity().getPassword();
        passType.setValue("password not stored");
        passType.setIsToken(false);

        JAXBUtil util = CRCJAXBUtil.getJAXBUtil();
        StringWriter strWriter = new StringWriter();
        edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory i2b2ObjFactory = new edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory();
        try {
            util.marshaller(i2b2ObjFactory.createRequest(i2b2RequestMsgType), strWriter);
        } catch (JAXBUtilException e) {
            throw new I2B2Exception("Error marshalling the request after resetting the password  ["
                    + StackTraceUtil.getStackTrace(e) + "]");
        }

        queryPdoMasterDao.createPdoQueryMaster(queryMaster, strWriter.toString());
    }

    private String getVersion(IQueryPdoMasterDao queryPdoMasterDao, String requestXml) throws I2B2Exception {
        QtQueryMaster queryMaster = new QtQueryMaster();

        I2B2RequestMessageHelper requestMessageHelper = new I2B2RequestMessageHelper(requestXml);
        return requestMessageHelper.getVersion();
    }

    private void copyModifierToItem(ItemType itemType, ModifierType modifierType) {
        ItemType.ConstrainByModifier modifierConstrain = itemType.getConstrainByModifier();
        modifierConstrain.setAppliedPath(modifierType.getAppliedPath());
        modifierConstrain.setDimColumndatatype(modifierType.getColumndatatype());
        modifierConstrain.setDimColumnname(modifierType.getColumnname());
        modifierConstrain.setDimDimcode(modifierType.getDimcode());
        modifierConstrain.setDimOperator(modifierType.getOperator());
        modifierConstrain.setDimTablename(modifierType.getTablename());
        modifierConstrain.setFacttablecolumn(modifierType.getFacttablecolumn());
        modifierConstrain.setModifierKey(modifierType.getKey());
        modifierConstrain.setModifierName(modifierType.getName());
    }

}