Changeset 812


Ignore:
Timestamp:
Aug 16, 2010, 6:04:00 PM (11 years ago)
Author:
keesvb
Message:

added Sample tests for deleting samples via parent sampling event and event group, corrected some small errors, updated BootStrap? to find out why Sample.parentEvent gets serialized into the db, still no luck...

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/conf/BootStrap.groovy

    r793 r812  
    4040                                BootStrapStudies.addExampleStudies()
    4141                        }
     42
     43                        println "Finished adding templates and studies"
    4244                }
    4345
     
    5153                TemplateEntity.getField(Sample.domainFields, 'material').ontologies = [Ontology.getOrCreateOntologyByNcboId(1005)]
    5254
     55                println "Registering SAM REST methods"
    5356                // register methods for accessing SAM's Rest services
    5457                if (grails.util.GrailsUtil.environment == GrailsApplication.ENV_PRODUCTION) {
     
    5962                }
    6063                CommunicationManager.registerRestWrapperMethodsSAMtoGSCF()
     64
     65                println "Done with BootStrap"
    6166        }
    6267
  • trunk/grails-app/conf/BootStrapStudies.groovy

    r806 r812  
    231231                def evS = new SamplingEvent(
    232232                        startTime: 3600 +7 * 24 * 3600,
    233                         endTime: 3600 +7 * 24 * 3600,
    234233                        template: liverSamplingEventTemplate,
    235234                        sampleTemplate: humanTissueSampleTemplate)
     
    238237                def evS4 = new SamplingEvent(
    239238                        startTime: 3600 +7 * 24 * 3600,
    240                         endTime: 3600 +7 * 24 * 3600,
    241239                        template: liverSamplingEventTemplate,
    242240                        sampleTemplate: humanTissueSampleTemplate)
     
    314312                        .setFieldValue("Cage", "" + (int)(x/2))
    315313
     314                        // We have to save the subject first, otherwise the parentEvent property of the sample cannot be set
     315                        // (this is possibly a Grails or Hibernate bug)
    316316                        mouseStudy.addToSubjects(currentSubject)
    317                         .with { if (!validate()) { errors.each { println it} } else save()}
     317                        currentSubject.with { if (!validate()) { errors.each { println it} } else save()}
    318318
    319319                        // Add subject to appropriate EventGroup
     
    333333                                template: humanBloodSampleTemplate,
    334334                                parentSubject: currentSubject,
    335                                 parentEvent: x > 40 ? evS4 : evS
     335                                parentEvent: evS //x > 40 ? evS4 : evS
    336336                        );
     337                        mouseStudy.addToSamples(currentSample)
     338                        currentSample.with { if (!validate()) { errors.each { println it} } else save()}
    337339                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
    338                         mouseStudy.addToSamples(currentSample).with { if (!validate()) { errors.each { println it} } else save()}
    339340                }
    340341
     
    388389                def bloodSamplingEvent = new SamplingEvent(
    389390                        startTime: 3 * 24 * 3600 + 30 * 3600,
    390                         endTime: 3 * 24 * 3600 + 30 * 3600,
    391391                        template: bloodSamplingEventTemplate,
    392392                        sampleTemplate: humanBloodSampleTemplate)
     
    411411                        .setFieldValue("BMI", 20 + Math.random() * 10F)
    412412
     413                        humanStudy.addToSubjects(currentSubject)
     414                        currentSubject.with { if (!validate()) { errors.each { println it} } else save()}
     415
    413416                        rootGroup.addToSubjects currentSubject
    414417                        rootGroup.save()
     
    421424                                parentEvent: bloodSamplingEvent
    422425                        );
     426
     427                        humanStudy.addToSamples(currentSample)
     428                        currentSample.with { if (!validate()) { errors.each { println it} } else save()}
    423429                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
    424 
    425                         humanStudy.addToSubjects(currentSubject).addToSamples(currentSample)
    426                         .with { if (!validate()) { errors.each { println it} } else save()}
    427430                }
    428431
     
    431434                humanStudy.addToEventGroups rootGroup
    432435
    433 
     436                println ".adding persons and saving PPSH study..."
    434437                // Add persons to study
    435438                def studyperson3 = new StudyPerson( person: person1, role: role2 )
    436 
    437439                humanStudy
    438440                .addToPersons( studyperson3 )
     
    440442                .with { if (!validate()) { errors.each { println it} } else save()}
    441443
    442                 // Add clinical data       ==> to be moved to SAM
    443 
    444                 def lipidAssay = new dbnp.clinicaldata.ClinicalAssay(
    445                         name: 'Lipid profile',
    446                         approved: true
    447                 ).with { if (!validate()) { errors.each { println it} } else save()}
    448 
    449                 def ldlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
    450                         name: 'LDL',
    451                         unit: 'mg/dL',
    452                         type: dbnp.data.FeatureType.QUANTITATIVE,
    453                         referenceValues: '100 mg/dL',
    454                         detectableLimit: 250,
    455                         isDrug: false, isIntake: true, inSerum: true
    456                 ).with { if (!validate()) { errors.each { println it} } else save()}
    457 
    458                 def hdlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
    459                         name: 'HDL',
    460                         unit: 'mg/dL',
    461                         type: dbnp.data.FeatureType.QUANTITATIVE,
    462                         referenceValues: '50 mg/dL',
    463                         detectableLimit: 100,
    464                         isDrug: false, isIntake: true, inSerum: true
    465                 ).with { if (!validate()) { errors.each { println it} } else save()}
    466 
    467                 lipidAssay.addToMeasurements ldlMeasurement
    468                 lipidAssay.addToMeasurements hdlMeasurement
    469 
    470                 def lipidAssayInstance = new dbnp.clinicaldata.ClinicalAssayInstance(
    471                         assay: lipidAssay
    472                 ).with { if (!validate()) { errors.each { println it} } else save()}
    473 
    474                 humanStudy.samples*.each {
    475                         new dbnp.clinicaldata.ClinicalFloatData(
    476                                 assay: lipidAssayInstance,
    477                                 measurement: ldlMeasurement,
    478                                 sample: it.name,
    479                                 value: Math.round(Math.random()*ldlMeasurement.detectableLimit)
    480                         ).with { if (!validate()) { errors.each { println it} } else save()}
    481 
    482                         new dbnp.clinicaldata.ClinicalFloatData(
    483                                 assay: lipidAssayInstance,
    484                                 measurement: hdlMeasurement,
    485                                 sample: it.name,
    486                                 value: Math.round(Math.random()*hdlMeasurement.detectableLimit)
    487                         ).with { if (!validate()) { errors.each { println it} } else save()}
    488                 }
    489 
    490                 // Add assay to study capture module
    491 
     444                println ".adding assay references to mouse example study..."
     445
     446                // Add SAM assay references
    492447                def clinicalModule = new AssayModule(
    493448                        name: 'SAM module for clinical data',
     
    510465                mouseStudy.save()
    511466
    512                 lipidAssayRef.with { if (!validate()) { errors.each { println it} } else save()}
     467                //lipidAssayRef.with { if (!validate()) { errors.each { println it} } else save()}
     468
     469                println ".adding assay references to human example study..."
    513470
    514471                def  glucoseAssay2Ref = new Assay(
     
    524481                )
    525482
    526                 humanStudy.addToAssays(glucoseAssay2Ref)
    527                 humanStudy.addToAssays(glucoseAssay3Ref)
    528                 humanStudy.save()
    529 
    530483                humanStudy.samples*.each {
    531484                        glucoseAssay2Ref.addToSamples(it)
     
    533486                }
    534487
    535                 glucoseAssay2Ref.with { if (!validate()) { errors.each { println it} } else save()}
    536                 glucoseAssay3Ref.with { if (!validate()) { errors.each { println it} } else save()}
     488
     489                humanStudy.addToAssays(glucoseAssay2Ref)
     490                humanStudy.addToAssays(glucoseAssay3Ref)
     491                humanStudy.save()
     492                println "Saving"
     493                //glucoseAssay2Ref.with { if (!validate()) { errors.each { println it} } else save()}
     494                //glucoseAssay3Ref.with { if (!validate()) { errors.each { println it} } else save()}
    537495
    538496        }
  • trunk/grails-app/controllers/dbnp/studycapturing/TemplateController.groovy

    r397 r812  
     1/**
     2 * TemplateController Controler
     3 *
     4 * An overview of
     5 *
     6 * @author  Kees van Bochove
     7 * @since       20100726
     8 * @package     dbnp.studycapturing
     9 *
     10 * Revision information:
     11 * $Rev$
     12 * $Author$
     13 * $Date$
     14 */
    115package dbnp.studycapturing
    2 /**
    3  * 888       888 888    888 8888888888 8888888b.  8888888888
    4  * 888   o   888 888    888 888        888   Y88b 888
    5  * 888  d8b  888 888    888 888        888    888 888
    6  * 888 d888b 888 8888888888 8888888    888   d88P 8888888
    7  * 888d88888b888 888    888 888        8888888P"  888
    8  * 88888P Y88888 888    888 888        888 T88b   888
    9  * 8888P   Y8888 888    888 888        888  T88b  888
    10  * 888P     Y888 888    888 8888888888 888   T88b 8888888888
    11  *
    12  * 8888888 .d8888b.     88888888888 888    888 8888888888
    13  *   888  d88P  Y88b        888     888    888 888
    14  *   888  Y88b.             888     888    888 888
    15  *   888   "Y888b.          888     8888888888 8888888
    16  *   888      "Y88b.        888     888    888 888
    17  *   888        "888        888     888    888 888
    18  *   888  Y88b  d88P        888     888    888 888
    19  * 8888888 "Y8888P"         888     888    888 8888888888
    20  *
    21  *   888888        d8888 888     888     d8888 8888888b.   .d88888b.   .d8888b.
    22  *     "88b       d88888 888     888    d88888 888  "Y88b d88P" "Y88b d88P  Y88b
    23  *      888      d88P888 888     888   d88P888 888    888 888     888 888    888
    24  *      888     d88P 888 Y88b   d88P  d88P 888 888    888 888     888 888
    25  *      888    d88P  888  Y88b d88P  d88P  888 888    888 888     888 888
    26  *      888   d88P   888   Y88o88P  d88P   888 888    888 888     888 888    888
    27  *      88P  d8888888888    Y888P  d8888888888 888  .d88P Y88b. .d88P Y88b  d88P
    28  *      888 d88P     888     Y8P  d88P     888 8888888P"   "Y88888P"   "Y8888P"
    29  *    .d88P
    30  *  .d88P"
    31  * 888P"
    32  *
    33  *  .d8888b.  888  .d8888b.  888  .d8888b.  888
    34  * d88P  Y88b 888 d88P  Y88b 888 d88P  Y88b 888
    35  *      .d88P 888      .d88P 888      .d88P 888
    36  *    .d88P"  888    .d88P"  888    .d88P"  888
    37  *    888"    888    888"    888    888"    888
    38  *    888     Y8P    888     Y8P    888     Y8P
    39  *             "              "              "
    40  *    888     888    888     888    888     888
    41  *
    42  *
    43  * TODO: add PROPER class and method documentation, just like have
    44  *       agreed upon hundreds of times!!!!
    45  */
     16
    4617class TemplateController {
    4718        def scaffold = Template
  • trunk/grails-app/domain/dbnp/studycapturing/Sample.groovy

    r784 r812  
    1212
    1313        // A Sample always belongs to one study.
    14         static belongsTo = [parent : Study]
     14        static belongsTo = [parent : Study, parentSubject : Subject, parentEvent : SamplingEvent]
    1515
    1616        // A Sample optionally has a parent Subject from which it was taken, this Subject should be in the same parent study.
    17         Subject parentSubject
     17        //long parentSubject
    1818
    1919        // Also, it has a parent SamplingEvent describing the actual sampling, also within the same parent study.
    20         SamplingEvent parentEvent
     20        // Strange enough, we need to define parentEvent as a long here, otherwise the SamplingEvent gets serialized into the database (?!!)
     21        //long parentEvent
    2122
    2223        String name             // should be unique with respect to the parent study (which can be inferred)
  • trunk/grails-app/domain/dbnp/studycapturing/SamplingEvent.groovy

    r803 r812  
    8989                return samples == null ? [] : samples
    9090        }
     91
     92        def String toString() {
     93                return fieldExists('Description') ? getFieldValue('Description') : ""
     94        }
     95       
    9196}
  • trunk/grails-app/domain/dbnp/studycapturing/Study.groovy

    r811 r812  
    237237                }
    238238
    239                 // remove event from the study
     239                // Delete the samples that have this sampling event as parent
     240                this.samples.findAll { it.parentEvent.equals(samplingEvent) }.each {
     241                        // This should remove the sample itself too, because of the cascading belongsTo relation
     242                        this.removeFromSamples(it)
     243                        // But apparently it needs an explicit delete() too
     244                        it.delete()
     245                        msg += ", sample '${it.name}' was deleted"
     246                }
     247
     248                // Remove event from the study
     249                // This should remove the event group itself too, because of the cascading belongsTo relation
    240250                this.removeFromSamplingEvents(samplingEvent)
     251                // But apparently it needs an explicit delete() too
     252                // (Which can be verified by outcommenting this line, then SampleTests.testDeleteViaParentSamplingEvent fails
     253                samplingEvent.delete()
    241254
    242255                return msg
     
    300313                                // -------
    301314
    302                                 println ".removing sample '${it.name}' from study '${this.name}'"
     315                                println ".removing sample '${it.name}' from study '${this.title}'"
    303316                                msg += ", sample '${it.name}' was deleted"
    304317                                this.removeFromSamples( it )
     
    321334
    322335                // remove the eventGroup from the study
    323                 println ".remove eventGroup '${eventGroup.name}' from study '${this.name}'"
     336                println ".remove eventGroup '${eventGroup.name}' from study '${this.title}'"
    324337                this.removeFromEventGroups(eventGroup)
    325338
  • trunk/test/integration/gscf/SampleTests.groovy

    r774 r812  
    88import dbnp.studycapturing.TemplateFieldType
    99import dbnp.studycapturing.Subject
     10import dbnp.studycapturing.EventGroup
    1011
    1112/**
     
    3233        final String testSamplingEventTemplateName = "Blood extraction"
    3334        final long testSamplingEventTime = 34534534L
     35        final long testSamplingEventDuration = 1000L
     36        final String testEventGroupName = "Test Group"
    3437
    3538
     
    4548                assert samplingEventTemplate
    4649
     50                // Look up sample template
     51                def sampleTemplate = Template.findByName(testSampleTemplateName)
     52                assert sampleTemplate
     53
    4754                // Create parent sampling event
    4855                def samplingEvent = new SamplingEvent(
    4956                        startTime: testSamplingEventTime,
    50                         endTime: testSamplingEventTime,
    51                         template: samplingEventTemplate
     57                        duration: testSamplingEventDuration,
     58                        template: samplingEventTemplate,
     59                        sampleTemplate: sampleTemplate
    5260                )
    5361
     
    6270                assert samplingEvent.validate()
    6371                assert samplingEvent.save(flush:true)
    64 
    65                 // Look up sample template
    66                 def sampleTemplate = Template.findByName(testSampleTemplateName)
    67                 assert sampleTemplate
    6872
    6973                // Create sample with the retrieved study as parent
     
    9397
    9498        void testSave() {
     99
    95100                // Try to retrieve the sample and make sure it's the same
    96101                def sampleDB = Sample.findByName(testSampleName)
     
    101106                assert sampleDB.parentEvent.startTime.equals(testSamplingEventTime)
    102107
     108                println "The sample has parentEvent ${sampleDB.parentEvent.encodeAsHTML()}"
    103109                // A sample without a name should not be saveable
    104110                sampleDB.name = null
     
    157163                assert !study.subjects.contains(subject)
    158164
    159                 assert !Subject.findByName(testSampleName)
     165                assert !Subject.findByName(subject.name)
    160166                assert !Sample.findByName(testSampleName)
    161167
    162168                assert Subject.count() == 0
     169                assert Sample.count() == 0
     170
     171        }
     172
     173        void testDeleteViaParentSamplingEvent() {
     174
     175                def sampleDB = Sample.findByName(testSampleName)
     176                assert sampleDB
     177
     178                // Retrieve the parent study
     179                def study = Study.findByTitle(testStudyName)
     180                assert study
     181
     182                def event = sampleDB.parentEvent
     183                assert event
     184
     185                // Use the deleteSamplingEvent method
     186                def msg = study.deleteSamplingEvent(event)
     187                println msg
     188                assert study.save()
     189
     190                assert !study.samplingEvents.contains(event)
     191
     192                assert !SamplingEvent.findByStartTime(testSamplingEventTime)
     193                assert !Sample.findByName(testSampleName)
     194
     195                assert SamplingEvent.count() == 0
     196                assert Sample.count() == 0
     197
     198        }
     199
     200        void testDeleteViaParentEventGroup() {
     201
     202                def sampleDB = Sample.findByName(testSampleName)
     203                assert sampleDB
     204
     205                // Retrieve the parent study
     206                def study = Study.findByTitle(testStudyName)
     207                assert study
     208
     209                // Retrieve the sample's sampling event
     210                def event = sampleDB.parentEvent
     211                assert event
     212
     213                // Create a subject and add it at the sample's parent
     214                def subject = SubjectTests.createSubject(study)
     215                assert subject
     216                sampleDB.parentSubject = subject
     217                assert sampleDB.validate()
     218                assert sampleDB.save()
     219
     220                // Create an event group in this study with the sample's sampling event
     221                def group = new EventGroup(
     222                    name: testEventGroupName
     223                )
     224                study.addToEventGroups(group)
     225                group.addToSubjects(subject)
     226                group.addToSamplingEvents(event)
     227                assert study.eventGroups.find { it.name == group.name}
     228                assert group.validate()
     229                assert study.save()
     230
     231                // Use the deleteSamplingEvent method
     232                def msg = study.deleteEventGroup(group)
     233                println msg
     234                assert study.save()
     235
     236                assert !study.eventGroups.contains(group)
     237                assert !EventGroup.findByName(testEventGroupName)
     238                assert !Sample.findByName(testSampleName)
     239
     240                assert EventGroup.count() == 0
    163241                assert Sample.count() == 0
    164242
Note: See TracChangeset for help on using the changeset viewer.