R/buildData.R

Defines functions FunCovar getDbuseHTNRx_TimeCovariateData createHTNRx_TimeCovariateSettings getDbuseC10_TimeCovariateData createC10_TimeCovariateSettings buildFollowUp getDbuseT1Rx_AgeCovariateData createT1Rx_AgeCovariateSettings getDbuseT1Rx_TimeCovariateData createT1Rx_TimeCovariateSettings getDbuseT1DM_AgeCovariateData createT1DM_AgeCovariateSettings getDbuseT1DM_TimeCovariateData createT1DM_TimeCovariateSettings getDbuseT2DM_TimeCovariateData createT2DM_TimeCovariateSettings getDbSmokingCovariateData createSmokingCovariateSettings transformToFlat buildData

Documented in buildData buildFollowUp createC10_TimeCovariateSettings createHTNRx_TimeCovariateSettings createSmokingCovariateSettings createT1DM_AgeCovariateSettings createT1DM_TimeCovariateSettings createT1Rx_AgeCovariateSettings createT1Rx_TimeCovariateSettings createT2DM_TimeCovariateSettings FunCovar getDbSmokingCovariateData getDbuseC10_TimeCovariateData getDbuseHTNRx_TimeCovariateData getDbuseT1DM_AgeCovariateData getDbuseT1DM_TimeCovariateData getDbuseT1Rx_AgeCovariateData getDbuseT1Rx_TimeCovariateData getDbuseT2DM_TimeCovariateData transformToFlat

#' Build a Covariate Data for cohort
#'
#' @param cdm_bbdd A connection for a OMOP database via DatabaseConnector
#' @param cdm_schema A name for OMOP schema
#' @param results_sc A name for result schema
#' @param cohortTable A name of the result cohort
#' @param acohortId A Cohort number
#'
#' @return A covariateData object
#' @export
#'
#' @importFrom rlang .data
#'
#' @examples
#' # Not yet
buildData <- function(cdm_bbdd,
                      cdm_schema,
                      results_sc,
                      cohortTable,
                      acohortId = 1){
  covDemo <- FeatureExtraction::createCovariateSettings(
    useDemographicsGender = TRUE,
    useDemographicsAge = TRUE)

  BMI_conceptId <- c(3038553, 40762638) #LOINC
  height_conceptId <- c(3036277, 3015514) #LOINC
  weight_conceptId <- c(3025315) #LOINC
  covMeasValueAny <- FeatureExtraction::createCovariateSettings(
    useMeasurementValueAnyTimePrior = TRUE,
    includedCovariateConceptIds = c(BMI_conceptId,
                                    height_conceptId,
                                    weight_conceptId),
    addDescendantsToInclude = TRUE)

  SBP_conceptId <- c(3004249, #LOINC
                     4152194) #SNOMED
  DBP_conceptId <- c(3012888, #LOINC
                     4154790) #SNOMED
  cT_conceptId <- c(3019900, 3027114) #LOINC
  cHDL_conceptId <- c(3011884, 3007070, 3023602) #LOINC
  cLDL_conceptId <- c(3028437, 3001308) #LOINC
  cVLDL_conceptId <- c(3022487) #LOINC
  Tg_conceptId <- c(3022192, 42868692)  #LOINC
  glu_conceptId <- c(3004501,
                     46235168, 40757523, 3005834, 40757527, 3016567, 40757528, 40757529,
                     40757627, 40757628,
                     3018251, 46236948,
                     3015024, 3036895, 3001022, 3016701, 3018582, 3008799, 3045700,
                     3020491) #LOINC
  alt_conceptId <- c(3006923, 46235106)
  CRP_conceptId <- c(3020460) #LOINC
  ferritin_conceptId <- c(3001122) #LOINC
  WBC_conceptId <- c(3010813) #LOINC
  neutrophils_conceptId <- c(3017732, 3046321, 43055364) #LOINC
  basophils_conceptId <- c(3006315, 43055368) #LOINC
  eosinophils_conceptId <- c(3013115, 43055367) #LOINC
  monocytes_conceptId <- c(3001604, 43055365) #LOINC
  lymphocytes_conceptId <- c(3019198, 43055366) #LOINC
  HbA1c_conceptId <- c(3034639, 3004410) #LOINC
  creatinine_conceptId <- c(3016723)
  albumin_ser_conceptId <- c(3024561)
  CKDEPI_conceptId <- c(40764999)
  GOT_conceptId <- c(3010587)
  GGT_conceptId <- c(3026910)
  vitD_conceptId <- c(43055034)
  PEPTIDCs_conceptId <- c(3010084)
  hemoglobin_conceptId <- c(3000963)
  covMeasValueLong <- FeatureExtraction::createCovariateSettings(
    useMeasurementValueLongTerm = TRUE,
    longTermStartDays = (-2)*365.25,
    endDays = 0*365.25,
    includedCovariateConceptIds = c(
      SBP_conceptId,
      DBP_conceptId,
      # cT_conceptId,
      # cHDL_conceptId,
      # cLDL_conceptId,
      # cVLDL_conceptId,
      # Tg_conceptId,
      glu_conceptId,
      alt_conceptId,
      CRP_conceptId,
      ferritin_conceptId,
      WBC_conceptId,
      neutrophils_conceptId,
      basophils_conceptId,
      eosinophils_conceptId,
      monocytes_conceptId,
      lymphocytes_conceptId,
      HbA1c_conceptId,
      creatinine_conceptId,
      albumin_ser_conceptId,
      CKDEPI_conceptId,
      GOT_conceptId,
      GGT_conceptId,
      vitD_conceptId,
      PEPTIDCs_conceptId,
      hemoglobin_conceptId),
    addDescendantsToInclude = TRUE)
  covMeasValue_lipid <- FeatureExtraction::createTemporalCovariateSettings(
    useMeasurementValue = TRUE,
    temporalStartDays = c(-2, 1, 3/12)*365.25,
    temporalEndDays = c(0, 2, 1)*365.25,
    includedCovariateConceptIds = c(
      cT_conceptId,
      cHDL_conceptId,
      cLDL_conceptId,
      cVLDL_conceptId,
      Tg_conceptId),
    addDescendantsToInclude = TRUE)

  T2DM_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 111,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 111,
                      analysisName = "T2DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(201826, 443732, 40482801, 40485020),
    addDescendantsToInclude = TRUE)

  obesity_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 112,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 112,
                      analysisName = "Obesity",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(433736),
    addDescendantsToInclude = TRUE)

  angor_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 113,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 113,
                      analysisName = "Angina pectoris",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(#I20
      321318, #Angina pectoris
      315296, #Preinfarction syndrome
      4127089), #Coronary artery spasm,
    addDescendantsToInclude = FALSE)

  ami_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 114,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 114,
                      analysisName = "AMI",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(312327, #Acute myocardial infarction
                                    4296653, #Acute ST segment elevation myocardial infarction
                                    45766075, #Acute anterior ST segment elevation myocardial infarction
                                    45766116, #Acute ST segment elevation myocardial infarction of inferior wall
                                    4296653, #Acute ST segment elevation myocardial infarction
                                    4270024, #Acute non-ST segment elevation myocardial infarction
                                    4329847, #Myocardial infarction
                                    #I22
                                    4108217, #Subsequent myocardial infarction
                                    4108677, #Subsequent myocardial infarction of anterior wall
                                    4108218, #Subsequent myocardial infarction of inferior wall
                                    45766241, #Subsequent non-ST segment elevation myocardial infarction
                                    45766114, #Subsequent ST segment elevation myocardial infarction
                                    #I23
                                    4108678, #Hemopericardium due to and following acute myocardial infarction
                                    438172, #Atrial septal defect due to and following acute myocardial infarction
                                    4119953, #Post-infarction ventricular septal defect
                                    4108679, #Rupture of cardiac wall without hemopericardium as current complication following acute myocardial infarction
                                    4108219, #Rupture of chordae tendinae due to and following acute myocardial infarction
                                    4108220, #Rupture of papillary muscle as current complication following acute myocardial infarction
                                    4108680, #Thrombosis of atrium, auricular appendage, and ventricle due to and following acute myocardial infarction
                                    4198141, #Post infarct angina
                                    # Altres
                                    434376, #Acute myocardial infarction of anterior wall
                                    438170, #	Acute myocardial infarction of inferior wall
                                    4176969, #Sequelae of cardiovascular disorders
                                    37309626, #Myocardial infarction due to demand ischemia
                                    43020460, #Acute ST segment elevation myocardial infarction involving left anterior descending coronary artery
                                    46270162, #	Acute ST segment elevation myocardial infarction due to left coronary artery occlusion
                                    46270163),
    addDescendantsToInclude = FALSE)

  stroke_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 115,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 115,
                      analysisName = "Stroke",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(
      #I63
      443454, #Cerebral infarction
      4110189, #Cerebral infarct due to thrombosis of precerebral arteries
      4110190, #Cerebral infarction due to embolism of precerebral arteries
      4043731, #Infarction - precerebral
      4110192, #Cerebral infarction due to thrombosis of cerebral arteries
      4108356, #Cerebral infarction due to embolism of cerebral arteries
      4111714, #Cerebral infarction due to cerebral venous thrombosis, non-pyogenic
      #I64
      #I65
      43022059, #Disease of non-coronary systemic artery
      4153380, #Disorder of carotid artery
      4159164, #Disorder of basilar artery
      443239, #Precerebral arterial occlusion
      #Altres
      255919, #Finding of head and neck region
      313226, #Carotid artery occlusion
      321887, #Disorder of artery
      381316, #Cerebrovascular accident
      381591, #Cerebrovascular disease
      4006294, #Basilar artery embolism
      4028073, #Disorder of artery of neck
      4213731, #Carotid artery embolism
      4273526, #Vertebral artery thrombosis
      4274969, #Vertebral artery embolism
      4288310, #Carotid artery obstruction
      4311124, #Carotid artery thrombosis
      4338227, #Basilar artery thrombosis
      45767658, #Cerebral infarction due to thrombosis of middle cerebral artery
      45772786, #Cerebral infarction due to embolism of middle cerebral artery
      46270031, #Cerebral infarction due to occlusion of precerebral artery
      46273649 #Cerebral infarction due to occlusion of basilar artery
    ),
    addDescendantsToInclude = FALSE)

  TIA_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 116,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 116,
                      analysisName = "TIA",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(#G45
      373503, #Transient cerebral ischemia
      437306, #Transient global amnesia
      4338523, #Amaurosis fugax
      381036, #	Multiple AND bilateral precerebral artery stenosis
      4112020, #Carotid artery syndrome hemispheric
      4048785, #Vertebrobasilar territory transient ischemic attack
      #G46
      381591, #Cerebrovascular disease
      4110194, #Middle cerebral artery syndrome
      4108360, #Anterior cerebral artery syndrome
      4110195, #Posterior cerebral artery syndrome
      4111710, #Brainstem stroke syndrome
      4111711, #Cerebellar stroke syndrome
      4045737, #Pure motor lacunar infarction
      4045738, #Pure sensory lacunar infarction
      4046360 #Lacunar infarction
    ),
    addDescendantsToInclude = FALSE)

  COPD_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 117,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 117,
                      analysisName = "COPD",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(255841, 261325, 255573),
    addDescendantsToInclude = TRUE)

  CKD_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 118,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 118,
                      analysisName = "CKD",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(46271022, 192359),
    addDescendantsToInclude = TRUE)

  cancer_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 119,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 119,
                      analysisName = "Cancer",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(443392, 4144289, 439392, 200962, 139750, 4311499, 137809, 197500),
    addDescendantsToInclude = TRUE)

  depress_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 120,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 120,
                      analysisName = "Depress",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(4282096, 4282316, 433440),
    addDescendantsToInclude = TRUE)

  htn_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 121,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 121,
                      analysisName = "HTN",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(320128, 442604, 444101, 319034, 443919, 44782429, 44784621,
                                    439696, 319826, 317895, 443771, 4110948, 319826),
    addDescendantsToInclude = TRUE)

  hf_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 122,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 122,
                      analysisName = "HF",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(316139, 319835, 439846, 443580, 443587, 4229440, 4273632, 40479192,
                                    40479576, 40480602, 40480603, 40481042, 40481043, 40482727, 44782718,
                                    44782733),
    addDescendantsToInclude = TRUE)

  liver_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 123,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 123,
                      analysisName = "LiverFailure",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(4098652, 197795, 4211974, 4012113,
                                    192240, 192242, 193693, 196625, 197490, 197494, 198683,
                                    198964, 439673, 439674, 439675,
                                    4245975, 200763, 4267417, 194990, 194984,
                                    192675, 192680, 196455, 199867, 200762,
                                    201901, 377604, 4026125, 4046123, 4058696, 4059290, 4064161,
                                    4135822, 4238978, 4240725, 4313846, 4340390,
                                    4340394, 4340941, 4340948, 40484532, 46269836),
    addDescendantsToInclude = TRUE)

  ra_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 124,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 124,
                      analysisName = "RA",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(36684997, 80809), #M05, M06
    addDescendantsToInclude = TRUE)

  sleep_apnea_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 125,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 125,
                      analysisName = "SleepApnea",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(313459), #G47.3
    addDescendantsToInclude = TRUE)

  pcos_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 126,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 126,
                      analysisName = "PCOS",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(40443308), #E28.2
    addDescendantsToInclude = TRUE)

  T1DM_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 127,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 127,
                      analysisName = "T1DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(201254, 435216, 40484648, 40484649),
    addDescendantsToInclude = TRUE)

  nephro_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 128,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 128,
                      analysisName = "Nephropathy due to DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(192279, #Disorder of kidney due to diabetes mellitus
                                    200687, #Renal disorder due to type 1 diabetes mellitus
                                    443731, #Renal disorder due to type 2 diabetes mellitus
                                    43531578 #Chronic kidney disease due to type 2 diabetes mellitus
    ),
    addDescendantsToInclude = FALSE)

  retino_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 129,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 129,
                      analysisName = "Retinopathy due to DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(376114, #Severe nonproliferative retinopathy due to diabetes mellitus
                                    376979, #Cataract due to diabetes mellitus
                                    377552, #Moderate nonproliferative retinopathy due to diabetes mellitus
                                    378743, #Mild nonproliferative retinopathy due to diabetes mellitus
                                    380096, #	Proliferative retinopathy due to diabetes mellitus
                                    380097, #	Macular edema due to diabetes mellitus
                                    443733, #Disorder of eye due to type 2 diabetes mellitus
                                    443767, #Disorder of eye due to diabetes mellitus
                                    4174977, #Retinopathy due to diabetes mellitus
                                    4221495, #Cataract due to diabetes mellitus type 2
                                    4225656, #Cataract due to diabetes mellitus type 1
                                    4227210, #Retinopathy due to type 1 diabetes mellitus
                                    4266637, #Severe nonproliferative retinopathy without macular edema due to diabetes mellitus
                                    4290822, #Severe nonproliferative retinopathy with clinically significant macular edema due to diabetes mellitus
                                    4338896, #Traction retinal detachment involving macula
                                    4338897, #Combined traction and rhegmatogenous retinal detachment
                                    4338901, #Traction detachment of retina due to diabetes mellitus
                                    37016179, #Mild nonproliferative retinopathy due to type 1 diabetes mellitus
                                    37016180, #Moderate nonproliferative retinopathy due to type 1 diabetes mellitus
                                    42538169, #Disorder of eye due to type 1 diabetes mellitus
                                    43530656, #Nonproliferative retinopathy due to type 2 diabetes mellitus
                                    43530685, #Proliferative retinopathy due to type 2 diabetes mellitus
                                    45757435, #	Mild nonproliferative retinopathy due to type 2 diabetes mellitus
                                    45763583, #Nonproliferative diabetic retinopathy due to type 1 diabetes mellitus
                                    45763584, #Proliferative retinopathy due to type 1 diabetes mellitus
                                    45769873, #Traction detachment of retina due to type 1 diabetes mellitus
                                    45770830, #Macular edema and retinopathy due to type 2 diabetes mellitus
                                    45770881, #Moderate nonproliferative retinopathy due to type 2 diabetes mellitus
                                    45773064 #Traction detachment of retina due to type 2 diabetes mellitus
    ),
    addDescendantsToInclude = FALSE)

  neuro_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 130,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 130,
                      analysisName = "Neuropathy due to DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(376065, #Disorder of nervous system due to type 2 diabetes mellitus
                                    376112, #Polyneuropathy due to diabetes mellitus
                                    377821, #Disorder of nervous system due to type 1 diabetes mellitus
                                    443730, #Disorder of nervous system due to diabetes mellitus
                                    4044391, #Neuropathy due to diabetes mellitus
                                    4048028, #Diabetic mononeuropathy
                                    4140466, #Lumbosacral radiculoplexus neuropathy due to type 2 diabetes mellitus
                                    4143857, #Lumbosacral radiculoplexus neuropathy due to type 1 diabetes mellitus
                                    4175440, #Autonomic neuropathy due to diabetes mellitus
                                    4191611, #Lumbosacral radiculoplexus neuropathy due to diabetes mellitus
                                    4222415, #Mononeuropathy due to type 2 diabetes mellitus
                                    4225055, #Mononeuropathy due to type 1 diabetes mellitus
                                    37016767, #Autonomic neuropathy due to type 1 diabetes mellitus
                                    37016768, #Autonomic neuropathy due to type 2 diabetes mellitus
                                    37017431, #Polyneuropathy due to type 1 diabetes mellitus
                                    37017432 #Polyneuropathy due to type 2 diabetes mellitus
    ),
    addDescendantsToInclude = FALSE)

  PAD_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 131,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 131,
                      analysisName = "PAD",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(
      74719, #Ulcer of foot
      134380, #Erythromelalgia
      # 138525, #Pain in limb
      195834, #Atherosclerosis of renal artery
      197304, #Ulcer of lower extremity
      312934, #Atherosclerosis of aorta
      314965, #Embolism and thrombosis of an arm or leg artery
      315558, #Atherosclerosis of arteries of the extremities
      317577, #Arteriosclerotic gangrene
      318443, #Arteriosclerotic vascular disease
      321052, #Peripheral vascular disease
      321882, #Generalized atherosclerosis
      442287, #Rest pain
      442774, #Intermittent claudication
      443358, #Ulcer of heel
      443593, #Ulcer of thigh
      4171556, #Ankle ulcer
      4177703, #Ulcer
      4316222, #Venous intermittent claudication
      4325344, #Pain at rest due to peripheral vascular disease
      35611566, #Bilateral lower limb atherosclerosis pain at rest co-occurrent and due to atherosclerosis
      35615028, #Bilateral atherosclerosis of lower limbs with gangrene
      36712805, #Pain at rest of left lower limb co-occurrent and due to atherosclerosis
      36712806, #Intermittent claudication of right lower limb co-occurrent and due to atherosclerosis
      36712807, #Pain at rest of right lower limb co-occurrent and due to atherosclerosis
      36712963, #Gangrene of left lower limb due to atherosclerosis
      36717006, #Intermittent claudication of bilateral lower limbs co-occurrent and due to atherosclerosis
      36717279, #Gangrene of right lower limb due to atherosclerosis
      36717286, #Intermittent claudication of left lower limb co-occurrent and due to atherosclerosis
      37110250, #Atherosclerosis of artery of lower limb
      37312519, #Ulcer of calf due to atherosclerosis of artery of lower limb
      37312520, #Ischemic foot ulcer due to atherosclerosis of artery of lower limb
      37312524, #Ulcer of ankle due to atherosclerosis of artery of lower limb
      37312529, #Intermittent claudication due to atherosclerosis of artery of limb
      37312531, #Gangrene of limb due to atherosclerosis of artery of limb
      40479625, #Atherosclerosis of artery
      40483538, #Atherosclerosis of bypass graft of limb
      40484541, #Atherosclerosis of autologous vein bypass graft of limb
      40484551, #Atherosclerosis of nonautologous biological bypass graft of limb
      44782819, #Chronic occlusion of artery of extremity
      46271459 #Atherosclerosis of bypass graft of lower limb
    ),
    addDescendantsToInclude = FALSE)

  dka_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 132,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 132,
                      analysisName = "Neuropathy due to DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(439770, #Ketoacidosis due to type 1 diabetes mellitus
                                    4009303, #Diabetic ketoacidosis without coma
                                    4224254 #Ketoacidotic coma due to type 1 diabetes mellitus
    ),
    addDescendantsToInclude = FALSE)

  hypoglyc_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 133,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 133,
                      analysisName = "Neuropathy due to DM",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(45769876, #Hypoglycemia due to type 1 diabetes mellitus
                                    4228112 #Hypoglycemic coma due to type 1 diabetes mellitus
                                    ),
    addDescendantsToInclude = FALSE)
  
  hypoglyc_vars <- FeatureExtraction::createAnalysisDetails(
    analysisId = 134,
    sqlFileName = "DomainConcept.sql",
    parameters = list(analysisId = 134,
                      analysisName = "Anaemia",
                      startDay = "anyTimePrior",
                      endDay = 0,
                      subType = "all",
                      domainId = "Condition",
                      domainTable = "condition_occurrence",
                      domainConceptId = "condition_concept_id",
                      domainStartDate = "condition_start_date",
                      domainEndDate = "condition_start_date"),
    includedCovariateConceptIds = c(439777 #Anemia
    ),
    addDescendantsToInclude = FALSE)

  A10_conceptId <- c(21600712,
                     782681, 793321, 1502829, 1502830, 1503327, 1525221, 1529352,
                     1547554, 1596977, 1597761, 1597772, 1597773, 1597781, 1597792,
                     19006931, 19021312, 19023424, 19023425, 19023426, 19029030, 19029061,
                     19058398, 19059800, 19077638, 19077682, 19078552, 19078559, 19079293,
                     19079465, 19095211, 19095212, 19099055, 19101729, 19112791, 19125041,
                     19125045, 19125049, 19129179, 19133793, 19135264, 21022404, 21036596,
                     21061594, 21061613, 21076306, 21081251, 21086042, 21100924, 21114195,
                     21133671, 21169719, 35408233, 35410536, 35412102, 35412890, 35412958,
                     36403507, 36403509, 36884964, 40044221, 40051377, 40052768, 40054707,
                     40139098, 40164885, 40164888, 40164891, 40164897, 40164913, 40164916,
                     40164942, 40164943, 40164946, 40166037, 40166041, 40239218, 42479624,
                     42479783, 42481504, 42481541, 42482012, 42482588, 42656231, 42656236,
                     42656240, 42708086, 42708090, 42899447, 42902356, 42902587, 42902742,
                     42902821, 42902945, 42902992, 42903059, 42903341, 43013885, 43013905,
                     43013911, 43013918, 43013924, 43013928, 43526467, 43526471, 44032735,
                     44058584, 44123708, 44785831, 45774709, 45774754, 45774893, 46233969,
                     46234047, 46234234, 46234237, 46287408, 46287689)

  sel_med_conceptId <- c(21600712, #DRUGS USED IN DIABETES
                         #Aquestes insulines no les troba
                         21076306, 44058584, 21086042, 21036596,
                         21601238, #C01
                         21600381, #C02
                         21601461, #C03
                         21601664, #C07
                         21601744, #C08
                         21601782, #C09
                         21601853, #C10
                         21603933, #M01A
                         # Antiinflamatoris
                         920458, 1103374, 1115008, 1118084, 1124300, 1125315, 1146810, 1150345,
                         1153928, 1156378, 1177480, 1178663, 1185922, 1189754, 1518254, 19029393,
                         19056874, 19110711,
                         # Antiagregants
                         1310149, 1325124, 19024063, 1301025, 1301065, 1308473, 1367571, 1436169,
                         1112807, 1302398, 1322184, 1331270, 1350310, 19042778, 19047423, 19069107,
                         40241186
  )
  covDrug <- FeatureExtraction::createCovariateSettings(
    useDrugGroupEraMediumTerm = TRUE,
    mediumTermStartDays = -365.25,
    endDays = 0,
    includedCovariateConceptIds = sel_med_conceptId,
    addDescendantsToInclude = TRUE)

  # smoking_vars <- FeatureExtraction::createAnalysisDetails(
  #   analysisId = 810,
  #   sqlFileName = "DomainConcept.sql",
  #   parameters = list(analysisId = 810,
  #                     analysisName = "Tobacco",
  #                     startDay = "anyTimePrior",
  #                     endDay = 1,
  #                     subType = "last",
  #                     domainId = "Observation",
  #                     domainTable = "observation",
  #                     domainConceptId = "VALUE_AS_CONCEPT_ID",
  #                     domainStartDate = "observation_date",
  #                     domainEndDate = ""),
  #   includedCovariateConceptIds = c(45879404, 45884037, 45883458),
  #   addDescendantsToInclude = TRUE)

  SmokingCovSet <- createSmokingCovariateSettings(useSmoking = TRUE)

  T2DM_TimeCovSet <- createT2DM_TimeCovariateSettings(useT2DM_Time = TRUE)
  T1DM_TimeCovSet <- createT1DM_TimeCovariateSettings(useT1DM_Time = TRUE)
  T1DM_AgeCovSet <- createT1DM_AgeCovariateSettings(useT1DM_Age = TRUE)
  T1Rx_TimeCovSet <- createT1Rx_TimeCovariateSettings(useT1Rx_Time = TRUE)
  # T1Rx_AgeCovSet <- createT1Rx_AgeCovariateSettings(useT1Rx_Age = TRUE)
  C10_TimeCovSet <- createC10_TimeCovariateSettings(useC10_Time = TRUE)
  HTNRx_TimeCovSet <- createHTNRx_TimeCovariateSettings(useHTNRx_Time = TRUE)

  covariateSettings <- list(covDemo,
                            covMeasValueAny,
                            covMeasValueLong,
                            # covMeasValue_lipid,
                            FeatureExtraction::createDetailedCovariateSettings(
                              list(T2DM_vars,
                                   obesity_vars,
                                   angor_vars,
                                   ami_vars,
                                   stroke_vars,
                                   TIA_vars,
                                   COPD_vars,
                                   CKD_vars,
                                   cancer_vars,
                                   depress_vars,
                                   htn_vars,
                                   hf_vars,
                                   liver_vars,
                                   ra_vars,
                                   sleep_apnea_vars,
                                   pcos_vars,
                                   T1DM_vars,
                                   nephro_vars,
                                   retino_vars,
                                   neuro_vars,
                                   PAD_vars,
                                   dka_vars,
                                   hypoglyc_vars)),
                            covDrug,
                            SmokingCovSet,
                            T2DM_TimeCovSet,
                            T1DM_TimeCovSet,
                            T1Rx_TimeCovSet,
                            T1DM_AgeCovSet,
                            # T1Rx_AgeCovSet,
                            C10_TimeCovSet,
                            HTNRx_TimeCovSet)

  covariateData <- FeatureExtraction::getDbCovariateData(
    connection = cdm_bbdd,
    cdmDatabaseSchema = cdm_schema,
    cohortDatabaseSchema = results_sc,
    cohortTable = cohortTable,
    cohortId = acohortId,
    rowIdField = "subject_id",
    covariateSettings = covariateSettings)

  covariateData_temp <- FeatureExtraction::getDbCovariateData(
    connection = cdm_bbdd,
    cdmDatabaseSchema = cdm_schema,
    cohortDatabaseSchema = results_sc,
    cohortTable = cohortTable,
    cohortId = acohortId,
    rowIdField = "subject_id",
    covariateSettings = covMeasValue_lipid)

  # T2DM_conceptId <- c(201530111, 201826111, 376065111, 443729111, 443731111, 443733111,
  #                     4193704111, 4196141111, 4221495111, 36714116111, 37016349111,
  #                     37017432111, 43530685111, 43530690111, 43531563111, 43531578111,
  #                     45770830111,
  #                     # Afegits executant el SIDIAP
  #                     4099651111, 45757363111, 4140466111, 37016768111, 4222876111, 43531616111,
  #                     45770881111)
  # DM_conceptId <- c(442793111, 321822111, 443730111, 192279111, 4048028111, 4226798111,
  #                   201820111, 4008576111, 443767111,
  #                   # Afegits executant el SIDIAP
  #                   4044391111, 4009303111, 376112111, 4159742111, 4114427111, 4131908111)
  # obesity_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 112),
  #   .data$covariateId)
  # angina_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 113),
  #   .data$covariateId)
  # ami_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 114),
  #   .data$covariateId)
  # stroke_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 115),
  #   .data$covariateId)
  # tia_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 116),
  #   .data$covariateId)
  # COPD_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 117),
  #   .data$covariateId)
  # CKD_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 118),
  #   .data$covariateId)
  # cancer_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 119),
  #   .data$covariateId)
  # depress_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 120),
  #   .data$covariateId)
  # htn_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 121),
  #   .data$covariateId)
  # hf_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 122),
  #   .data$covariateId)
  # liver_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 123),
  #   .data$covariateId)
  # ra_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 124),
  #   .data$covariateId)
  # sleep_apnea_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 125),
  #   .data$covariateId)
  # pcos_conceptId <- dplyr::pull(
  #   dplyr::filter(covariateData$covariateRef,
  #                 .data$analysisId == 126),
  #   .data$covariateId)

  # covariateData$covariates <- dplyr::mutate(
  #   .data = covariateData$covariates,
  #   covariateId = dplyr::if_else(.data$covariateId %in% T2DM_conceptId, 201826111, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% DM_conceptId, 201820111, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% obesity_conceptId, 433736112, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% angina_conceptId, 321318113, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% ami_conceptId, 312327114, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% stroke_conceptId, 443454115, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% tia_conceptId, 373503116, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% COPD_conceptId, 255841117, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% CKD_conceptId, 46271022118, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% cancer_conceptId, 443392119, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% depress_conceptId, 4282096120, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% htn_conceptId, 320128121, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% hf_conceptId, 316139122, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% liver_conceptId, 194984123, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% ra_conceptId, 80809124, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% sleep_apnea_conceptId, 313459125, .data$covariateId),
  #   covariateId = dplyr::if_else(.data$covariateId %in% pcos_conceptId, 40443308126, .data$covariateId))
  # covariateData$covariates <- dplyr::distinct(covariateData$covariates)
  return(list(covariateData = covariateData, covariateData_temp = covariateData_temp))
}

#' Transform covariateData object into FlatTable
#'
#' Si volem agafar l'últim valor podem canviar-ho
#'
#' @param covariateData A covariateDate object
#' @param covariateData_temp A Temporal covariateDate object
#'
#' @return A data.table with the covariate data
#' @export
#'
#' @importFrom rlang .data
#'
#' @examples
#' #Not yet
transformToFlat <- function(covariateData,
                            covariateData_temp){
  vec_antiinflam <- c(920458, 1103374, 1115008, 1118084, 1124300, 1125315, 1146810, 1150345,
                      1153928, 1156378, 1177480, 1178663, 1185922, 1189754, 1518254, 19029393,
                      19056874, 19110711)*1000 + 411
  vec_antiagregant <- c(1310149, 1325124, 19024063, 1301025, 1301065, 1308473, 1367571, 1436169,
                        1112807, 1302398, 1322184, 1331270, 1350310, 19042778, 19047423, 19069107,
                        40241186)*1000 + 411
  bbdd_covar <- dplyr::collect(covariateData$covariates)
  bbdd_covar <-  dplyr::mutate(
    .data = bbdd_covar,
    variable = as.character(NA),
    variable = dplyr::if_else(.data$covariateId == 1002, 'age', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 8507001, 'sex_male', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 8532001, 'sex_female', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 111, 'T2DM', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 112, 'obesity', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 113, 'angor', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 114, 'ami', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 115, 'stroke', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 116, 'tia', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 117, 'COPD', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 118, 'CKD', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 119, 'cancer', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 120, 'depress', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 121, 'htn', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 122, 'hf', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 123, 'liver', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 124, 'ra', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 125, 'sleep_apnea', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 126, 'pcos', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 127, 'T1DM', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 128, 'nephro', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 129, 'retino', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 130, 'neuro', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 131, 'PAD', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 132, 'DKA', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 133, 'Hypoglyc', .data$variable),
    variable = dplyr::if_else(stringr::str_sub(.data$covariateId, start = -3L) == 134, 'Anaemia', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21600712411, 'A10', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21600713411, 'A10A', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21600744411, 'A10B', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601238411, 'C01', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21600381411, 'C02', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601461411, 'C03', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601664411, 'C07', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601744411, 'C08', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601782411, 'C09', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601853411, 'C10', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21603933411, 'M01A', .data$variable),
    variable = dplyr::if_else(.data$covariateId %in% vec_antiinflam, 'antiinflamatori', .data$variable),
    variable = dplyr::if_else(.data$covariateId %in% vec_antiagregant, 'antiagregant', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 45879404, 'Never', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 45884037, 'Current', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 45883458, 'Former', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3038553531705, 'BMI', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3036277582705, 'height', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3025315529705, 'weight', .data$variable),
    variable = dplyr::if_else(.data$covariateId %in% c(3004249323706, 4152194876706), 'SBP', .data$variable),
    variable = dplyr::if_else(.data$covariateId %in% c(3012888323706, 4154790876706), 'DBP', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3010813848706, 'Leukocytes', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3001604554706, 'Monocytes', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3034639554706, 'HbA1c', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3027114840706, 'cT', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3011884840706, 'cHDL', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3028437840706, 'cLDL', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3022192840706, 'Tg', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3004501840706, 'Glucose', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3006923645706, 'ALT', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3020460751706, 'CRP', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3001122748706, 'Ferritin', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 7) == 3016723, 'Creatinine', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 7) == 3024561, 'Albumin', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 8) == 40764999, 'CKDEPI', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 7) == 3010587, 'GOT', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 7) == 3026910, 'GGT', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 8) == 43055034, 'vitD', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 7) == 3010084, 'PEPTIDCs', .data$variable),
    variable = dplyr::if_else(substr(.data$covariateId, 1, 7) == 3000963, 'Hemoglobin', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 201820211, 'TimeT2DM', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 201254212, 'TimeT1DM', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 201254216, 'TimeT1Rx', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 201254213, 'AgeT1DM', .data$variable),
    # variable = dplyr::if_else(.data$covariateId == 201254217, 'AgeT1Rx', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21601853214, 'TimeC10', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 21600381215, 'TimeHTNRx', .data$variable))
  bbdd_covar <- dplyr::group_by(.data = bbdd_covar, .data$rowId, .data$variable)
  bbdd_covar <- dplyr::summarise(
    .data = bbdd_covar,
    covariateValue = mean(.data$covariateValue),
    .groups = 'keep')
  bbdd_covar <- dplyr::ungroup(x = bbdd_covar)
  bbdd_covar_temp <- dplyr::collect(covariateData_temp$covariates)
  bbdd_covar_temp <-  dplyr::mutate(
    .data = bbdd_covar_temp,
    variable = as.character(NA),
    variable = dplyr::if_else(.data$covariateId == 3027114840702 & .data$timeId == 1, 'cT', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3011884840702 & .data$timeId == 1, 'cHDL', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3028437840702 & .data$timeId == 1, 'cLDL', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3022192840702 & .data$timeId == 1, 'Tg', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3027114840702 & .data$timeId == 2, 'cT_1y', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3011884840702 & .data$timeId == 2, 'cHDL_1y', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3028437840702 & .data$timeId == 2, 'cLDL_1y', .data$variable),
    variable = dplyr::if_else(.data$covariateId == 3022192840702 & .data$timeId == 2, 'Tg_1y', .data$variable))
  bbdd_covar_temp <- dplyr::filter(.data = bbdd_covar_temp, !is.na(.data$variable))
  bbdd_covar_temp <- dplyr::group_by(.data = bbdd_covar_temp, .data$rowId, .data$variable)
  bbdd_covar_temp <- dplyr::summarise(
    .data = bbdd_covar_temp,
    covariateValue = mean(.data$covariateValue),
    .groups = 'keep')
  bbdd_covar_temp <- dplyr::ungroup(x = bbdd_covar_temp)
  bbdd_covar <- tidyr::pivot_wider(
    data = rbind(bbdd_covar, bbdd_covar_temp),
    id_cols = 'rowId',
    names_from = 'variable',
    values_from = 'covariateValue')
  bbdd_covar <- dplyr::mutate(
    .data = bbdd_covar,
    dplyr::across(dplyr::any_of(c('sex_female', 'sex_male', 'T2DM', 'obesity', 'angor', 'tia',
                                  'stroke', 'ami', 'Current', 'Former', 'Never',
                                  'A10', 'A10A', 'A10B','C01', 'C02', 'C03', 'C07', 'C08', 'C09',
                                  'C10', 'M01A',
                                  'COPD', 'CKD', 'cancer', 'depress', 'htn', 'hf', 'liver', 'ra',
                                  'sleep_apnea', 'pcos',
                                  "neuro", "nephro", "retino", "PAD",
                                  'ALT', 'Hemoglobin')),
                  ~ tidyr::replace_na(.x, 0)))
    # sex_female = dplyr::if_else(is.na(sex_female), 0, sex_female),
    # sex_male = dplyr::if_else(is.na(sex_male), 0, sex_male),
    # T2DM = dplyr::if_else(is.na(T2DM), 0, T2DM),
    # obesity = dplyr::if_else(is.na(obesity), 0, obesity),
    # angor = dplyr::if_else(is.na(angor), 0, angor),
    # tia = dplyr::if_else(is.na(tia), 0, tia),
    # stroke = dplyr::if_else(is.na(stroke), 0, stroke),
    # ami = dplyr::if_else(is.na(ami), 0, ami),
    # Current = dplyr::if_else(is.na(Current), 0, Current),
    # Former = dplyr::if_else(is.na(Former), 0, Former))
  # bbdd_covar <- dplyr::mutate(
  #   .data = bbdd_covar,
  #   TimeT1DM_diag = TimeT1DM,
  #   TimeT1DM = pmax(TimeT1DM, TimeT1Rx, na.rm = T))
  return(bbdd_covar)
}

#' Auxiliar function to create Smoking status
#'
#' @param useSmoking Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createSmokingCovariateSettings <- function(useSmoking = TRUE){
  covariateSettings <- list(useSmoking = useSmoking)
  attr(covariateSettings, "fun") <- "getDbSmokingCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Smokins status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbSmokingCovariateData <- function(connection,
                                      oracleTempSchema = NULL,
                                      cdmDatabaseSchema,
                                      cohortTable = "#cohort_person",
                                      cohortId = -1,
                                      cdmVersion = "5",
                                      rowIdField = "subject_id",
                                      covariateSettings,
                                      aggregated = FALSE){
  writeLines("Constructing Smoking covariates")
  if (covariateSettings$useSmoking == FALSE) {
    return(NULL)
  }

  # Some SQL to construct the covariate:
  sql <- "SELECT DISTINCT ON (obs2.person_id)
                 obs2.person_id AS row_id,
                 obs2.value_as_concept_id AS covariate_id,
                 1 AS covariate_value
          FROM (SELECT *
                FROM @cdm_database_schema.OBSERVATION obs
                INNER JOIN @cohort_table cohort
                      ON cohort.subject_id = obs.person_id
                WHERE obs.observation_concept_id = 43054909 AND
                      obs.observation_date <= cohort.cohort_start_date AND
                      cohort.cohort_definition_id IN (@cohort_definition_id)) obs2
          ORDER BY obs2.person_id, obs2.observation_date desc"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(45879404, 45884037, 45883458),
                             covariateName = c('Never smoker', 'Current some day smoker',
                                               'Former smoker'),
                             analysisId = 500,
                             conceptId = rep(43054909, 3))
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 500,
                            analysisName = "Smoking status",
                            domainId = "Observation",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "Y",
                            missingMeansZero = "Y")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Auxiliar function to create Time form T2DM diagnosis
#'
#' @param useT2DM_Time Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createT2DM_TimeCovariateSettings <- function(useT2DM_Time = TRUE){
  covariateSettings <- list(useT2DM_Time = useT2DM_Time)
  attr(covariateSettings, "fun") <- "getDbuseT2DM_TimeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Time from T2DM diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseT2DM_TimeCovariateData <- function(connection,
                                           oracleTempSchema = NULL,
                                           cdmDatabaseSchema,
                                           cohortTable = "#cohort_person",
                                           cohortId = -1,
                                           cdmVersion = "5",
                                           rowIdField = "subject_id",
                                           covariateSettings,
                                           aggregated = FALSE){
  writeLines("Constructing T2DM_Time covariates")
  if (covariateSettings$useT2DM_Time == FALSE) {
    return(NULL)
  }

  # included_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = c(201820, 442793, 443238))
  # included_id <- DatabaseConnector::querySql(connection,
  #                                            sql = included_sql)
  # excluded_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = c(201254, 435216, 4058243, 40484648,195771, 761051))
  # excluded_id <- DatabaseConnector::querySql(connection,
  #                                            sql = excluded_sql)
  # # Some SQL to construct the covariate:
  # sql <- "SELECT DISTINCT ON (cond2.person_id)
  #                cond2.person_id AS row_id,
  #                201820211  AS covariate_id,
  #                DATEDIFF(DAY, cond2.condition_start_date, cond2.cohort_start_date) AS covariate_value
  #         FROM (SELECT *
  #               FROM @cdm_database_schema.CONDITION_OCCURRENCE cond
  #               INNER JOIN @cohort_table cohort
  #                     ON cohort.subject_id = cond.person_id
  #               WHERE cond.condition_start_date <= DATEADD(DAY, 0, cohort.cohort_start_date)
  #                 AND cond.condition_concept_id != 0
  #                 AND cond.condition_concept_id NOT IN (@excluded_concept_table)
  #                 AND cond.condition_concept_id IN (@included_concept_table)
  #                 AND cohort.cohort_definition_id IN (@cohort_definition_id)) cond2
  #         ORDER BY cond2.person_id, cond2.condition_start_date"
  sql <- "SELECT
            cond.person_id AS row_id,
            201820211  AS covariate_id,
            DATEDIFF(DAY, MIN(cond.condition_start_date), cohort.cohort_start_date) AS covariate_value
          FROM
            @cdm_database_schema.CONDITION_OCCURRENCE cond
            JOIN @cdm_database_schema.CONCEPT c ON cond.condition_concept_id = c.concept_id
            JOIN @cdm_database_schema.CONCEPT_ANCESTOR ca ON cond.condition_concept_id = ca.descendant_concept_id
            JOIN @cohort_table cohort ON cohort.subject_id = cond.person_id
          WHERE
            NOT EXISTS(
                SELECT 1
                FROM @cdm_database_schema.CONCEPT_ANCESTOR ca2
                WHERE ca2.descendant_concept_id = cond.condition_concept_id
                  AND ca2.ancestor_concept_id IN (201254, 435216, 4058243, 40484648, 195771, 761051)
            )
            AND ca.ancestor_concept_id IN (201820, 442793, 443238)
            AND cohort.cohort_definition_id = @cohort_definition_id
            AND cond.condition_start_date <= cohort.cohort_start_date
          GROUP BY cond.person_id, cohort.cohort_start_date"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(201820211),
                             covariateName = c('Time from T2DM'),
                             analysisId = 211,
                             conceptId = 201820)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 211,
                            analysisName = "Time from T2DM",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Auxiliar function to create Time form T1DM diagnosis
#'
#' @param useT1DM_Time Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createT1DM_TimeCovariateSettings <- function(useT1DM_Time = TRUE){
  covariateSettings <- list(useT1DM_Time = useT1DM_Time)
  attr(covariateSettings, "fun") <- "getDbuseT1DM_TimeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Time from T1DM diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseT1DM_TimeCovariateData <- function(connection,
                                           oracleTempSchema = NULL,
                                           cdmDatabaseSchema,
                                           cohortTable = "#cohort_person",
                                           cohortId = -1,
                                           cdmVersion = "5",
                                           rowIdField = "subject_id",
                                           covariateSettings,
                                           aggregated = FALSE){
  writeLines("Constructing T1DM_Time covariates")
  if (covariateSettings$useT1DM_Time == FALSE) {
    return(NULL)
  }

  # included_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = c(201254, 435216, 40484648, 40484649))
  # included_id <- DatabaseConnector::querySql(connection,
  #                                            sql = included_sql)
  # # Some SQL to construct the covariate:
  # sql <- "SELECT DISTINCT ON (cond2.person_id)
  #                cond2.person_id AS row_id,
  #                201254212  AS covariate_id,
  #                DATEDIFF(DAY, cond2.condition_start_date, cond2.cohort_start_date) AS covariate_value
  #         FROM (SELECT *
  #               FROM @cdm_database_schema.CONDITION_OCCURRENCE cond
  #               INNER JOIN @cohort_table cohort
  #                     ON cohort.subject_id = cond.person_id
  #               WHERE cond.condition_start_date <= DATEADD(DAY, 0, cohort.cohort_start_date)
  #                 AND cond.condition_concept_id != 0
  #                 AND cond.condition_concept_id IN (@included_concept_table)
  #                 AND cohort.cohort_definition_id IN (@cohort_definition_id)) cond2
  #         ORDER BY cond2.person_id, cond2.condition_start_date"
  sql <- "SELECT
            cond.person_id AS row_id,
            201254212  AS covariate_id,
            DATEDIFF(DAY, MIN(cond.condition_start_date), cohort.cohort_start_date) AS covariate_value
          FROM @cdm_database_schema.CONDITION_OCCURRENCE cond
            JOIN @cdm_database_schema.CONCEPT c ON cond.condition_concept_id = c.concept_id
            JOIN @cdm_database_schema.CONCEPT_ANCESTOR ca ON cond.condition_concept_id = ca.descendant_concept_id
            JOIN @cohort_table cohort ON cohort.subject_id = cond.person_id
          WHERE
            ca.ancestor_concept_id IN (201254, 435216, 40484648, 40484649)
            AND cohort.cohort_definition_id = @cohort_definition_id
            AND cond.condition_start_date <= cohort.cohort_start_date
          GROUP BY cond.person_id, cohort.cohort_start_date"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(201254212),
                             covariateName = c('Time from T1DM'),
                             analysisId = 212,
                             conceptId = 201254)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 212,
                            analysisName = "Time from T1DM",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Auxiliar function to create Age for first T1DM diagnosis
#'
#' @param useT1DM_Age Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createT1DM_AgeCovariateSettings <- function(useT1DM_Age = TRUE){
  covariateSettings <- list(useT1DM_Age = useT1DM_Age)
  attr(covariateSettings, "fun") <- "getDbuseT1DM_AgeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Age for T1DM diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseT1DM_AgeCovariateData <- function(connection,
                                           oracleTempSchema = NULL,
                                           cdmDatabaseSchema,
                                           cohortTable = "#cohort_person",
                                           cohortId = -1,
                                           cdmVersion = "5",
                                           rowIdField = "subject_id",
                                           covariateSettings,
                                           aggregated = FALSE){
  writeLines("Constructing T1DM_Age covariates")
  if (covariateSettings$useT1DM_Age == FALSE) {
    return(NULL)
  }

  # included_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = c(201254, 435216, 40484648, 40484649))
  # included_id <- DatabaseConnector::querySql(connection,
  #                                            sql = included_sql)
  # # Falta afegir la data de naixement a la cohort. S'ha de fer un INNER JOIN
  # # Some SQL to construct the covariate:
  # sql <- "SELECT DISTINCT ON (cond2.person_id)
  #              cond2.person_id AS row_id,
  #              201254213 AS covariate_id,
  #              DATEDIFF(DAY, DATEFROMPARTS(cond2.year_of_birth, cond2.month_of_birth, cond2.day_of_birth),
  #                       cond2.condition_start_date)/365.25 AS covariate_value
  #       FROM (SELECT cond.person_id,
  #                      cond.condition_start_date,
  #                      person_table.year_of_birth,
  #                      person_table.month_of_birth,
  #                      person_table.day_of_birth
  #             FROM @cdm_database_schema.CONDITION_OCCURRENCE cond
  #             INNER JOIN @cohort_table cohort
  #                   ON cohort.subject_id = cond.person_id
  #                   INNER JOIN @cdm_database_schema.PERSON person_table
  #                         ON person_table.person_id = cohort.subject_id
  #             WHERE cond.condition_start_date <= DATEADD(DAY, 0, cohort.cohort_start_date)
  #               AND cond.condition_concept_id != 0
  #               AND cond.condition_concept_id IN (@included_concept_table)
  #               AND cohort.cohort_definition_id IN (@cohort_definition_id)) cond2
  #         ORDER BY cond2.person_id, cond2.condition_start_date"
  sql <- "SELECT
          cond.person_id AS row_id,
          201254213 AS covariate_id,
          DATEDIFF(DAY, DATEFROMPARTS(person_table.year_of_birth, person_table.month_of_birth, person_table.day_of_birth),
                        MIN(cond.condition_start_date))/365.25 AS covariate_value
        FROM @cdm_database_schema.CONDITION_OCCURRENCE cond
          JOIN @cdm_database_schema.CONCEPT_ANCESTOR ca ON cond.condition_concept_id = ca.descendant_concept_id
          JOIN @cohort_table cohort ON cohort.subject_id = cond.person_id
          JOIN @cdm_database_schema.PERSON person_table ON person_table.person_id = cond.person_id
        WHERE
          ca.ancestor_concept_id IN (201254, 435216, 40484648, 40484649)
          AND cond.condition_start_date <= cohort.cohort_start_date
          AND cohort.cohort_definition_id = @cohort_definition_id
        GROUP BY cond.person_id, person_table.year_of_birth, person_table.month_of_birth, person_table.day_of_birth"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(201254213),
                             covariateName = c('Age from T1DM'),
                             analysisId = 213,
                             conceptId = 201254)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 213,
                            analysisName = "Age from T1DM",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Auxiliar function to create Time form T1DM diagnosis
#'
#' @param useT1Rx_Time Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createT1Rx_TimeCovariateSettings <- function(useT1Rx_Time = TRUE){
  covariateSettings <- list(useT1Rx_Time = useT1Rx_Time)
  attr(covariateSettings, "fun") <- "getDbuseT1Rx_TimeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Time from T1Rx diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseT1Rx_TimeCovariateData <- function(connection,
                                           oracleTempSchema = NULL,
                                           cdmDatabaseSchema,
                                           cohortTable = "#cohort_person",
                                           cohortId = -1,
                                           cdmVersion = "5",
                                           rowIdField = "subject_id",
                                           covariateSettings,
                                           aggregated = FALSE){
  writeLines("Constructing T1Rx_Time covariates")
  if (covariateSettings$useT1Rx_Time == FALSE) {
    return(NULL)
  }

  vec_insulin <- c(1596977, 19058398, 19078552, 19078559, 19095211, 19095212, 19112791, 19133793,
                   19135264, 21076306, 21086042, 35410536, 35412958, 40051377, 40052768, 42479783,
                   42481504, 42481541, 42899447, 42902356, 42902587, 42902742, 42902821, 42902945,
                   42903059, 44058584, 46233969, 46234047, 46234234, 46234237, 1502905, 1513843,
                   1513876, 1516976, 1531601, 1544838, 1550023, 1562586, 1567198, 1586346, 1586369,
                   1588986, 1590165, 1596977, 19013926, 19013951, 19090180, 19090187, 19090204,
                   19090221, 19090226, 19090229, 19090244, 19090247, 19090249, 19091621, 35198096,
                   35602717, 42899447, 46221581)
  # included_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = vec_insulin)
  # included_id <- DatabaseConnector::querySql(connection,
  #                                            sql = included_sql)
  # Some SQL to construct the covariate:
  sql <- "SELECT
                 cond.person_id AS row_id,
                 201254216 AS covariate_id,
                 DATEDIFF(DAY, MIN(cond.DRUG_EXPOSURE_START_DATE), cohort.cohort_start_date) AS covariate_value
          FROM @cdm_database_schema.DRUG_EXPOSURE cond
            JOIN @cdm_database_schema.CONCEPT_ANCESTOR ca ON cond.DRUG_CONCEPT_ID = ca.descendant_concept_id
            JOIN @cohort_table cohort ON cohort.subject_id = cond.person_id
          WHERE ca.ancestor_concept_id IN (@diab_id)
            AND cond.DRUG_EXPOSURE_START_DATE <= cohort.cohort_start_date
            AND cohort.cohort_definition_id IN (@cohort_definition_id)
          GROUP BY cond.person_id, cohort.cohort_start_date"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId,
                           diab_id = vec_insulin)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(201254216),
                             covariateName = c('Time from T1Rx'),
                             analysisId = 216,
                             conceptId = 201254)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 216,
                            analysisName = "Time from T1Rx",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Auxiliar function to create Age for first T1Rx drug
#'
#' @param useT1Rx_Age Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createT1Rx_AgeCovariateSettings <- function(useT1Rx_Age = TRUE){
  covariateSettings <- list(useT1Rx_Age = useT1Rx_Age)
  attr(covariateSettings, "fun") <- "getDbuseT1Rx_AgeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Age for T1Rx diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseT1Rx_AgeCovariateData <- function(connection,
                                          oracleTempSchema = NULL,
                                          cdmDatabaseSchema,
                                          cohortTable = "#cohort_person",
                                          cohortId = -1,
                                          cdmVersion = "5",
                                          rowIdField = "subject_id",
                                          covariateSettings,
                                          aggregated = FALSE){
  writeLines("Constructing T1Rx_Age covariates")
  if (covariateSettings$useT1Rx_Age == FALSE) {
    return(NULL)
  }

  vec_insulin <- c(1596977, 19058398, 19078552, 19078559, 19095211, 19095212, 19112791, 19133793,
                   19135264, 21076306, 21086042, 35410536, 35412958, 40051377, 40052768, 42479783,
                   42481504, 42481541, 42899447, 42902356, 42902587, 42902742, 42902821, 42902945,
                   42903059, 44058584, 46233969, 46234047, 46234234, 46234237, 1502905, 1513843,
                   1513876, 1516976, 1531601, 1544838, 1550023, 1562586, 1567198, 1586346, 1586369,
                   1588986, 1590165, 1596977, 19013926, 19013951, 19090180, 19090187, 19090204,
                   19090221, 19090226, 19090229, 19090244, 19090247, 19090249, 19091621, 35198096,
                   35602717, 42899447, 46221581)
  included_sql <- SqlRender::render(sql = "SELECT *
                                           FROM @schema_cdm.CONCEPT_ANCESTOR
                                           WHERE ancestor_concept_id IN (@diab_id)",
                                    schema_cdm = cdmDatabaseSchema,
                                    diab_id = vec_insulin)
  included_id <- DatabaseConnector::querySql(connection,
                                             sql = included_sql)
  # Falta afegir la data de naixement a la cohort. S'ha de fer un INNER JOIN
  # Some SQL to construct the covariate:
  sql <- "SELECT DISTINCT ON (cond2.person_id)
               cond2.person_id AS row_id,
               201254217 AS covariate_id,
               DATEDIFF(DAY, DATEFROMPARTS(cond2.year_of_birth, cond2.month_of_birth, cond2.day_of_birth),
                        cond2.DRUG_EXPOSURE_START_DATE)/365.25 AS covariate_value
        FROM (SELECT cond.person_id,
                       cond.DRUG_EXPOSURE_START_DATE,
                       person_table.year_of_birth,
                       person_table.month_of_birth,
                       person_table.day_of_birth
              FROM @cdm_database_schema.DRUG_EXPOSURE cond
              INNER JOIN @cohort_table cohort
                    ON cohort.subject_id = cond.person_id
                    INNER JOIN @cdm_database_schema.PERSON person_table
                          ON person_table.person_id = cohort.subject_id
              WHERE cond.DRUG_EXPOSURE_START_DATE <= DATEADD(DAY, 0, cohort.cohort_start_date)
                  AND cond.DRUG_CONCEPT_ID != 0
                  AND cond.DRUG_CONCEPT_ID IN (@included_concept_table)
                  AND cohort.cohort_definition_id IN (@cohort_definition_id)) cond2
          ORDER BY cond2.person_id, cond2.DRUG_EXPOSURE_START_DATE"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId,
                           included_concept_table = included_id$DESCENDANT_CONCEPT_ID)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(201254217),
                             covariateName = c('Age from T1Rx'),
                             analysisId = 217,
                             conceptId = 201254)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 217,
                            analysisName = "Age from T1Rx",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Build a Follow-up Data for cohort
#'
#' @param cdm_bbdd A connection for a OMOP database via DatabaseConnector
#' @param cdm_schema A name for OMOP schema
#' @param results_sc A name for result schema
#' @param cohortTable A name of the result cohort
#' @param acohortId A Cohort number
#' @param bbdd_covar A data.table create by transformToFlat function
#'
#' @return A data.frame object
#' @export
#'
#' @importFrom rlang .data
#'
#' @examples
#' # Not yet
buildFollowUp <- function(cdm_bbdd,
                          cdm_schema,
                          results_sc,
                          cohortTable,
                          acohortId = 1,
                          bbdd_covar){
  obs_per_sql <- "SELECT * FROM @omopSc.OBSERVATION_PERIOD
                  WHERE person_id IN (SELECT subject_id FROM @resultSc.@cohortTable)"
  obs_per <- DatabaseConnector::querySql(connection = cdm_bbdd,
                                         sql = SqlRender::render(sql = obs_per_sql,
                                                                 omopSc = cdm_schema,
                                                                 resultSc = results_sc,
                                                                 cohortTable = cohortTable))
  death_sql <- "SELECT * FROM @omopSc.DEATH
                WHERE person_id IN (SELECT subject_id FROM @resultSc.@cohortTable)"
  death <- DatabaseConnector::querySql(connection = cdm_bbdd,
                                       sql = SqlRender::render(sql = death_sql,
                                                               omopSc = cdm_schema,
                                                               resultSc = results_sc,
                                                               cohortTable = cohortTable))

  cohort <- DatabaseConnector::querySql(connection = cdm_bbdd,
                                        sql = SqlRender::render(sql = "SELECT * FROM @resultSc.@cohortTable",
                                                                resultSc = results_sc,
                                                                cohortTable = cohortTable))

  cohort_event <- cohort[cohort$COHORT_DEFINITION_ID %in% c(acohortId, 3:18),]
  cohort_event$event <- as.character(NA)
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == acohortId] <- 'dintro'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 3] <- 'AMI'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 4] <- 'Angor'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 5] <- 'StrokeI'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 6] <- 'TIA'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 7] <- 'Nephropathy'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 8] <- 'Retinopathy'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 9] <- 'Neuropathy'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 10] <- 'PAD'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 11] <- 'Angor_unstable'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 12] <- 'AMI_WP4'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 13] <- 'stroke_WP4'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 14] <- 'neuroWP4'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 15] <- 'nephroWP4'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 16] <- 'retinoWP4'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 17] <- 'footWP4'
  cohort_event$event[cohort_event$COHORT_DEFINITION_ID == 18] <- 'DKAWP4'

  cohort_event_w <- tidyr::pivot_wider(data = cohort_event,
                                       id_cols = "SUBJECT_ID",
                                       names_from = 'event',
                                       names_prefix = 'ep_',
                                       values_from = "COHORT_START_DATE")
  names(cohort_event_w)[names(cohort_event_w) == "ep_dintro"] <- 'dintro'
  cohort_event_w <- merge(cohort_event_w,
                          obs_per[, c("PERSON_ID", "OBSERVATION_PERIOD_END_DATE")],
                          by.x = 'SUBJECT_ID',
                          by.y = 'PERSON_ID',
                          all.x = TRUE)

  bbdd_covar <- merge(bbdd_covar,
                      cohort_event_w,
                      by.x = 'rowId',
                      by.y = "SUBJECT_ID",
                      all.x = TRUE)
  bbdd_covar <- merge(bbdd_covar,
                      death,
                      by.x = 'rowId',
                      by.y = "PERSON_ID",
                      all.x = TRUE)
  bbdd_covar$i.ep_AMI <- 0
  bbdd_covar$i.ep_AMI[bbdd_covar$dintro < bbdd_covar$ep_AMI &
                        bbdd_covar$ep_AMI <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_AMI <- as.numeric(pmin(bbdd_covar$ep_AMI, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_Angor <- 0
  bbdd_covar$i.ep_Angor[bbdd_covar$dintro < bbdd_covar$ep_Angor &
                          bbdd_covar$ep_Angor <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_Angor <- as.numeric(pmin(bbdd_covar$ep_Angor, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_StrokeI <- 0
  bbdd_covar$i.ep_StrokeI[bbdd_covar$dintro < bbdd_covar$ep_StrokeI &
                            bbdd_covar$ep_StrokeI <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_StrokeI <- as.numeric(pmin(bbdd_covar$ep_StrokeI, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_TIA <- 0
  bbdd_covar$i.ep_TIA[bbdd_covar$dintro < bbdd_covar$ep_TIA &
                        bbdd_covar$ep_TIA <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_TIA <- as.numeric(pmin(bbdd_covar$ep_TIA, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_Nephropathy <- 0
  bbdd_covar$i.ep_Nephropathy[bbdd_covar$dintro < bbdd_covar$ep_Nephropathy &
                                bbdd_covar$ep_Nephropathy <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_Nephropathy <- as.numeric(pmin(bbdd_covar$ep_Nephropathy, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_Retinopathy <- 0
  bbdd_covar$i.ep_Retinopathy[bbdd_covar$dintro < bbdd_covar$ep_Retinopathy &
                                bbdd_covar$ep_Retinopathy <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_Retinopathy <- as.numeric(pmin(bbdd_covar$ep_Retinopathy, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_Neuropathy <- 0
  bbdd_covar$i.ep_Neuropathy[bbdd_covar$dintro < bbdd_covar$ep_Neuropathy &
                                bbdd_covar$ep_Neuropathy <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_Neuropathy <- as.numeric(pmin(bbdd_covar$ep_Neuropathy, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_PAD <- 0
  bbdd_covar$i.ep_PAD[bbdd_covar$dintro < bbdd_covar$ep_PAD &
                               bbdd_covar$ep_PAD <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_PAD <- as.numeric(pmin(bbdd_covar$ep_PAD, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_Angor_unstable <- 0
  bbdd_covar$i.ep_Angor_unstable[bbdd_covar$dintro < bbdd_covar$ep_Angor_unstable &
                                   bbdd_covar$ep_Angor_unstable <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_Angor_unstable <- as.numeric(pmin(bbdd_covar$ep_Angor_unstable, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_AMI_WP4 <- 0
  bbdd_covar$i.ep_AMI_WP4[bbdd_covar$dintro < bbdd_covar$ep_AMI_WP4 &
                            bbdd_covar$ep_AMI_WP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_AMI_WP4 <- as.numeric(pmin(bbdd_covar$ep_AMI_WP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_stroke_WP4 <- 0
  bbdd_covar$i.ep_stroke_WP4[bbdd_covar$dintro < bbdd_covar$ep_stroke_WP4 &
                            bbdd_covar$ep_stroke_WP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_stroke_WP4 <- as.numeric(pmin(bbdd_covar$ep_stroke_WP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_neuroWP4 <- 0
  bbdd_covar$i.ep_neuroWP4[bbdd_covar$dintro < bbdd_covar$ep_neuroWP4 &
                               bbdd_covar$ep_neuroWP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_neuroWP4 <- as.numeric(pmin(bbdd_covar$ep_neuroWP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_nephroWP4 <- 0
  bbdd_covar$i.ep_nephroWP4[bbdd_covar$dintro < bbdd_covar$ep_nephroWP4 &
                             bbdd_covar$ep_nephroWP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_nephroWP4 <- as.numeric(pmin(bbdd_covar$ep_nephroWP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_retinoWP4 <- 0
  bbdd_covar$i.ep_retinoWP4[bbdd_covar$dintro < bbdd_covar$ep_retinoWP4 &
                              bbdd_covar$ep_retinoWP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_retinoWP4 <- as.numeric(pmin(bbdd_covar$ep_retinoWP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_footWP4 <- 0
  bbdd_covar$i.ep_footWP4[bbdd_covar$dintro < bbdd_covar$ep_footWP4 &
                              bbdd_covar$ep_footWP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_footWP4 <- as.numeric(pmin(bbdd_covar$ep_footWP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25
  bbdd_covar$i.ep_DKAWP4 <- 0
  bbdd_covar$i.ep_DKAWP4[bbdd_covar$dintro < bbdd_covar$ep_DKAWP4 &
                            bbdd_covar$ep_DKAWP4 <= bbdd_covar$OBSERVATION_PERIOD_END_DATE] <- 1
  bbdd_covar$t.ep_DKAWP4 <- as.numeric(pmin(bbdd_covar$ep_DKAWP4, bbdd_covar$OBSERVATION_PERIOD_END_DATE, na.rm = T) - bbdd_covar$dintro)/365.25

  return(bbdd_covar)
}

#' Auxiliar function to create Time form C10 diagnosis
#'
#' @param useC10_Time Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createC10_TimeCovariateSettings <- function(useC10_Time = TRUE){
  covariateSettings <- list(useC10_Time = useC10_Time)
  attr(covariateSettings, "fun") <- "getDbuseC10_TimeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Time from C10 diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseC10_TimeCovariateData <- function(connection,
                                          oracleTempSchema = NULL,
                                          cdmDatabaseSchema,
                                          cohortTable = "#cohort_person",
                                          cohortId = -1,
                                          cdmVersion = "5",
                                          rowIdField = "subject_id",
                                          covariateSettings,
                                          aggregated = FALSE){
  writeLines("Constructing C10_Time covariates")
  if (covariateSettings$useC10_Time == FALSE) {
    return(NULL)
  }

  # included_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = c(21601853))
  # included_id <- DatabaseConnector::querySql(connection,
  #                                            sql = included_sql)
  # # Some SQL to construct the covariate:
  # sql <- "SELECT DISTINCT ON (cond2.person_id)
  #                cond2.person_id AS row_id,
  #                21601853214  AS covariate_id,
  #                DATEDIFF(DAY, cond2.DRUG_EXPOSURE_START_DATE, cond2.cohort_start_date) AS covariate_value
  #         FROM (SELECT *
  #               FROM @cdm_database_schema.DRUG_EXPOSURE cond
  #               INNER JOIN @cohort_table cohort
  #                     ON cohort.subject_id = cond.person_id
  #               WHERE cond.DRUG_EXPOSURE_START_DATE <= DATEADD(DAY, 0, cohort.cohort_start_date)
  #                 AND cond.DRUG_CONCEPT_ID != 0
  #                 AND cond.DRUG_CONCEPT_ID IN (@included_concept_table)
  #                 AND cohort.cohort_definition_id IN (@cohort_definition_id)) cond2
  #         ORDER BY cond2.person_id, cond2.DRUG_EXPOSURE_START_DATE"
  sql <- "SELECT
             de.person_id AS row_id,
             21601853214 AS covariate_id,
             DATEDIFF(day, MIN(de.drug_era_start_date), r.cohort_start_date) AS covariate_value
          FROM
             @cdm_database_schema.drug_era de
             JOIN @cdm_database_schema.concept c ON de.drug_concept_id = c.concept_id
             JOIN @cdm_database_schema.concept_ancestor ca ON c.concept_id = ca.descendant_concept_id
             JOIN @cohort_table r ON de.person_id = r.subject_id
          WHERE
             ca.ancestor_concept_id = 21601853
             AND r.cohort_definition_id = @cohort_definition_id
             AND de.drug_era_start_date <= r.cohort_start_date
          GROUP BY
             de.person_id, r.cohort_start_date"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(21601853214),
                             covariateName = c('Time from C10'),
                             analysisId = 214,
                             conceptId = 21601853)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 214,
                            analysisName = "Time from C10",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Auxiliar function to create Time form HTN medication diagnosis
#'
#' @param useHTNRx_Time Logical valor
#'
#' @return covariateSettings object
#' @export
#'
#' @examples
#' #Not yet
createHTNRx_TimeCovariateSettings <- function(useHTNRx_Time = TRUE){
  covariateSettings <- list(useHTNRx_Time = useHTNRx_Time)
  attr(covariateSettings, "fun") <- "getDbuseHTNRx_TimeCovariateData"
  class(covariateSettings) <- "covariateSettings"
  return(covariateSettings)
}

#' Auxiliar function to create Time from HTN Rx diagnosis status SQL implementation
#'
#' @param connection A connection for a OMOP database via DatabaseConnector
#' @param oracleTempSchema Only for Oracle Database
#' @param cdmDatabaseSchema A name for OMOP schema
#' @param cohortTable A name of the result cohort
#' @param cohortId A Cohort number
#' @param cdmVersion CDM version
#' @param rowIdField Column with the subject identification
#' @param covariateSettings covariateSettings object generetad via FeatureExtraction
#' @param aggregated Logical value
#'
#' @return Function to use with FeatureExtraction to build covariateData
#' @export
#'
#' @examples
#' #Not yet
getDbuseHTNRx_TimeCovariateData <- function(connection,
                                            oracleTempSchema = NULL,
                                            cdmDatabaseSchema,
                                            cohortTable = "#cohort_person",
                                            cohortId = -1,
                                            cdmVersion = "5",
                                            rowIdField = "subject_id",
                                            covariateSettings,
                                            aggregated = FALSE){
  writeLines("Constructing HTNRx_Time covariates")
  if (covariateSettings$useHTNRx_Time == FALSE) {
    return(NULL)
  }

  # included_sql <- SqlRender::render(sql = "SELECT *
  #                                          FROM @schema_cdm.CONCEPT_ANCESTOR
  #                                          WHERE ancestor_concept_id IN (@diab_id)",
  #                                   schema_cdm = cdmDatabaseSchema,
  #                                   diab_id = c(21600381, #C02
  #                                               21601461, #C03
  #                                               21601664, #C07
  #                                               21601744, #C08
  #                                               21601782)) #C09
  # included_id <- DatabaseConnector::querySql(connection,
  #                                            sql = included_sql)
  # # Some SQL to construct the covariate:
  # sql <- "SELECT DISTINCT ON (cond2.person_id)
  #                cond2.person_id AS row_id,
  #                21600381215  AS covariate_id,
  #                DATEDIFF(DAY, cond2.DRUG_EXPOSURE_START_DATE, cond2.cohort_start_date) AS covariate_value
  #         FROM (SELECT *
  #               FROM @cdm_database_schema.DRUG_EXPOSURE cond
  #               INNER JOIN @cohort_table cohort
  #                     ON cohort.subject_id = cond.person_id
  #               WHERE cond.DRUG_EXPOSURE_START_DATE <= DATEADD(DAY, 0, cohort.cohort_start_date)
  #                 AND cond.DRUG_CONCEPT_ID != 0
  #                 AND cond.DRUG_CONCEPT_ID IN (@included_concept_table)
  #                 AND cohort.cohort_definition_id IN (@cohort_definition_id)) cond2
  #         ORDER BY cond2.person_id, cond2.DRUG_EXPOSURE_START_DATE"
  sql <- "SELECT
             de.person_id AS row_id,
             21600381215 AS covariate_id,
             DATEDIFF(day, MIN(de.drug_era_start_date), r.cohort_start_date) AS covariate_value
          FROM
             @cdm_database_schema.drug_era de
             JOIN @cdm_database_schema.concept c ON de.drug_concept_id = c.concept_id
             JOIN @cdm_database_schema.concept_ancestor ca ON c.concept_id = ca.descendant_concept_id
             JOIN @cohort_table r ON de.person_id = r.subject_id
          WHERE
             ca.ancestor_concept_id IN (21600381, 21601461, 21601664,  21601744, 21601782)
             AND r.cohort_definition_id = @cohort_definition_id
             AND de.drug_era_start_date <= r.cohort_start_date
          GROUP BY
             de.person_id, r.cohort_start_date"
  sql <- SqlRender::render(sql,
                           cdm_database_schema = cdmDatabaseSchema,
                           cohort_table = cohortTable, # ha de ser results_sc.cohortTable
                           cohort_definition_id = cohortId)
  sql <- SqlRender::translate(sql, targetDialect = attr(connection, "dbms"))
  # Retrieve the covariate:
  covariates <- DatabaseConnector::querySql(connection, sql, snakeCaseToCamelCase = TRUE)
  # Construct covariate reference:
  covariateRef <- data.frame(covariateId = c(21600381215),
                             covariateName = c('Time from HTNRx'),
                             analysisId = 215,
                             conceptId = 21600381)
  # Construct analysis reference:
  analysisRef <- data.frame(analysisId = 215,
                            analysisName = "Time from HTNRX",
                            domainId = "Condition",
                            startDay = NA,
                            endDay = 0,
                            isBinary = "N",
                            missingMeansZero = "N")
  # Construct analysis reference:
  metaData <- list(sql = sql, call = match.call())
  result <- Andromeda::andromeda(covariates = covariates,
                                 covariateRef = covariateRef,
                                 analysisRef = analysisRef)
  attr(result, "metaData") <- metaData
  class(result) <- "CovariateData"
  return(result)
}

#' Funcion para pasar del servidor a una tabla plana
#' Necesita totes les coses del servidor més quina cohort volem contruir.
#'
#' @param cdm_bbdd A connection for a OMOP database via DatabaseConnector
#' @param cdm_schema A name for OMOP schema
#' @param results_sc A name for result schema
#' @param cohortTable A name of the result cohort
#' @param acohortId A Cohort number
#'
#' @return List with three objects: descriptive for numeric and category and database ready to analysis.
#' @export
#'
#' @examples
#' #Not yet
FunCovar <- function(cdm_bbdd,
                     cdm_schema,
                     results_sc,
                     cohortTable,
                     acohortId){
  covariateData_aux <- buildData(cdm_bbdd = cdm_bbdd,
                                 cdm_schema = cdm_schema,
                                 results_sc = results_sc,
                                 cohortTable = cohortTable,
                                 acohortId = acohortId)
  covariateData_aux_temp <- covariateData_aux$covariateData_temp
  covariateData_aux <- covariateData_aux$covariateData
  # #Calculem el MPR pel T1DM i els eliminem si MPR inferior a 90%
  # if (acohortId == 2){
  #   sql_cohort <- "SELECT * FROM sophia_test.cohorttable WHERE cohort_definition_id = 2"
  #   cohort <- DatabaseConnector::querySql(connection = cdm_bbdd,
  #                                         sql = sql_cohort)
  #   cohort$time_obs <- with(cohort, as.numeric(COHORT_END_DATE - COHORT_START_DATE + 1))
  #   vec_insulin <- c(1596977, 19058398, 19078552, 19078559, 19095211, 19095212, 19112791, 19133793,
  #                    19135264, 21076306, 21086042, 35410536, 35412958, 40051377, 40052768, 42479783,
  #                    42481504, 42481541, 42899447, 42902356, 42902587, 42902742, 42902821, 42902945,
  #                    42903059, 44058584, 46233969, 46234047, 46234234, 46234237, 1502905, 1513843,
  #                    1513876, 1516976, 1531601, 1544838, 1550023, 1562586, 1567198, 1586346, 1586369,
  #                    1588986, 1590165, 1596977, 19013926, 19013951, 19090180, 19090187, 19090204,
  #                    19090221, 19090226, 19090229, 19090244, 19090247, 19090249, 19091621, 35198096,
  #                    35602717, 42899447, 46221581)
  #   sql_insulin <- "SELECT * FROM omop21t2_test.DRUG_ERA WHERE person_id IN (@id) AND DRUG_CONCEPT_ID IN (@insulin)"
  #   insulin <- DatabaseConnector::querySql(connection = cdm_bbdd,
  #                                          sql = SqlRender::render(sql_insulin,
  #                                                                  id = cohort$SUBJECT_ID,
  #                                                                  insulin = vec_insulin))
  #   insulin_treat <- dplyr::arrange(.data = insulin,
  #                                   PERSON_ID, DRUG_ERA_START_DATE)
  #   n_prev <- pull(count(insulin_treat), n)
  #   cond <- TRUE
  #   while(cond){
  #     insulin_treat <- group_by(insulin_treat, PERSON_ID)
  #     insulin_treat <- mutate(insulin_treat,
  #                             canvi = lag(DRUG_ERA_END_DATE) < DRUG_ERA_START_DATE,
  #                             canvi = dplyr::if_else(is.na(canvi), FALSE, canvi),
  #                             treat = cumsum(canvi))
  #     insulin_treat <- group_by(insulin_treat, PERSON_ID, treat)
  #     insulin_treat <- summarise(insulin_treat,
  #                                DRUG_ERA_START_DATE = min(DRUG_ERA_START_DATE),
  #                                DRUG_ERA_END_DATE = max(DRUG_ERA_END_DATE),
  #                                .groups = 'drop')
  #     n_act <- pull(count(insulin_treat), n)
  #     # cat('Prev: ', n_prev, ' Act: ', n_act, '\n')
  #     cond <- n_prev > n_act
  #     n_prev <- n_act
  #   }
  #   insulin_treat <- mutate(insulin_treat,
  #                           time = as.numeric(DRUG_ERA_END_DATE - DRUG_ERA_START_DATE + 1))
  #   cohort <- dplyr::left_join(cohort,
  #                              insulin_treat,
  #                              by = c('SUBJECT_ID' = 'PERSON_ID'))
  #   cohort$MPR <- with(cohort, time/time_obs)
  #   cohort <- dplyr::filter(cohort, 0.75 < MPR)
  #   covariateData_aux_temp <- dplyr::filter(covariateData_aux_temp,
  #                                           rowId %in% cohort$SUBJECT_ID)
  #   covariateData_aux <- dplyr::filter(covariateData_aux,
  #                                      rowId %in% cohort$SUBJECT_ID)
  # }
  covariateData2_aux <- FeatureExtraction::aggregateCovariates(covariateData_aux)
  sel_med_conceptId <- c(21600712, #DRUGS USED IN DIABETES
                         #Aquestes insulines no les troba
                         21076306, 44058584, 21086042, 21036596,
                         21601238, #C01
                         21600381, #C02
                         21601461, #C03
                         21601664, #C07
                         21601744, #C08
                         21601782, #C09
                         21601853, #C10
                         21603933 #M01A
  )
  cov_cate_resum_aux <- dplyr::filter(
    .data = covariateData2_aux$covariateRef,
    .data$analysisId %in% c(411, 413) & .data$conceptId %in% sel_med_conceptId |
      !(.data$analysisId %in% c(411, 413)))
  cov_cate_resum_aux <- dplyr::inner_join(
    x = cov_cate_resum_aux,
    y = covariateData2_aux$covariates)
  cov_cate_resum_aux <- dplyr::mutate(
    .data = cov_cate_resum_aux,
    covariateId = as.character(floor(.data$covariateId)),
    analysisId = as.integer(.data$analysisId),
    conceptId = as.integer(.data$conceptId),
    sumValue = as.integer(.data$sumValue),
    averageValue = .data$averageValue*100)
  cov_cate_resum_aux <-dplyr::collect(x = cov_cate_resum_aux)
  cov_num_resum_aux <- dplyr::inner_join(
    x = covariateData2_aux$covariateRef,
    y = covariateData2_aux$covariatesContinuous)
  cov_num_resum_aux <- dplyr::mutate(
    .data = cov_num_resum_aux,
    covariateId = as.character(floor(.data$covariateId)),
    analysisId = as.integer(.data$analysisId),
    conceptId = as.integer(.data$conceptId))
  cov_num_resum_aux <- dplyr::select(
    .data = cov_num_resum_aux,
    -.data$covariateId, -.data$analysisId, -.data$conceptId)
  cov_num_resum_aux <- dplyr::collect(x = cov_num_resum_aux)
  bbdd_covar_aux <- transformToFlat(covariateData_aux,
                                    covariateData_aux_temp)
  bbdd_covar_aux <- buildFollowUp(cdm_bbdd = cdm_bbdd,
                                  cdm_schema = cdm_schema,
                                  results_sc = results_sc,
                                  cohortTable = cohortTable,
                                  acohortId = acohortId,
                                  bbdd_covar = bbdd_covar_aux)
  return(list(cov_cate_resum = cov_cate_resum_aux,
              cov_num_resum = cov_num_resum_aux,
              bbdd_covar = bbdd_covar_aux))
}
Blanch-Font/SOPHIA documentation built on May 12, 2023, 1:09 a.m.