source: trunk/grails-app/services/CreateBulkDataService.groovy @ 410

Last change on this file since 410 was 399, checked in by gav, 15 years ago

Remove email and emailShow from Person in preparation for ContactDetails.

File size: 6.9 KB
Line 
1import grails.util.GrailsUtil
2
3/**
4* Provides a data service to create a large volume of test data for load testing.
5*/
6class  CreateBulkDataService {
7
8    boolean transactional = false
9
10    def authService
11    def taskService
12    def dateUtilService
13    def appConfigService
14    def assignedGroupService
15    def assignedPersonService
16
17    def sessionFactory
18    def propertyInstanceMap = org.codehaus.groovy.grails.plugins.DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP
19
20    def startTime
21    def lastBatchStarted
22
23/*******************************************
24Start of Group methods.
25Generally use these methods to create data.
26*******************************************/
27
28    /**
29    * Make a run of data creation.
30    */
31    def create() {
32        if(!GrailsUtil.environment == "development") {
33            log.error "Dev environment not detected, will NOT create bulk data."
34            return false
35        }
36
37        log.info "Creating BULK data..."
38
39        // Person and Utils
40        log.info "Creating persons..."
41        createBulkTestPersons()
42
43//         createBulkTestSites()
44//         createBulkTestDepartments()
45//         createBulkTestSuppliers()
46//         createBulkTestManufacturers()
47
48        // Tasks
49        log.info "Creating tasks..."
50        createBulkTestTasks()
51
52//         createBulkTestEntries()
53//         createBulkTestAssignedGroups()
54//         createBulkTestAssignedPersons()
55//         createBulkTestTaskRecurringSchedules()
56
57        // Inventory
58//         createBulkTestInventoryStores()  /// @todo: Perhaps a 'createQuickStartData' method?
59//         createBulkTestInventoryLocations()
60//         createBulkTestInventoryGroups() /// @todo: Perhaps a 'createQuickStartData' method?
61//         createBulkTestInventoryItems()
62
63        // Assets
64//         createBulkTestLifePlan()
65//         createBulkTestTaskProcedure()
66//         createBulkTestMaintenanceActions()
67//         createBulkTestSections()
68//         createBulkTestAssets()
69//         createBulkTestAssetExtenedAttributes()
70//         createBulkTestAssetSubItems()
71//         createBulkTestAssetSubItemExtenedAttributes()
72
73        log.info "Creating BULK data...complete."
74        return true
75
76    }
77
78/******************
79Start of Person
80*******************/
81
82    def createBulkTestPersons() {
83        //Person
84        def passClearText = "pass"
85        def passwordEncoded = authService.encodePassword(passClearText)
86        def personInstance
87
88        def start = Person.count() + 1
89        def end = start + 100
90
91        def range = start..end
92
93        def loginName = "BtLoginName"
94        String btLoginName
95        def firstName = "BtFirstName"
96        String btFirstName
97        def lastName = "BtLastName"
98
99        def authority2 = Authority.get(2)
100        def authority3 = Authority.get(3)
101        def personGroup1 = PersonGroup.get(1)
102        def personGroup2 = PersonGroup.get(2)
103        def personGroup3 = PersonGroup.get(3)
104        def personGroup4 = PersonGroup.get(4)
105        def personGroup5 = PersonGroup.get(5)
106
107        range.each() {
108
109            btLoginName = loginName + it
110            btFirstName = firstName + it
111
112            personInstance = new Person(loginName: btLoginName,
113                                        firstName: btFirstName,
114                                        lastName: lastName,
115                                        pass: passClearText,
116                                        password: passwordEncoded)
117            saveAndTest(personInstance)
118            personInstance.addToAuthorities(authority2)
119            personInstance.addToAuthorities(authority3)
120            personInstance.addToPersonGroups(personGroup1)
121            personInstance.addToPersonGroups(personGroup2)
122            personInstance.addToPersonGroups(personGroup3)
123            personInstance.addToPersonGroups(personGroup4)
124            personInstance.addToPersonGroups(personGroup5)
125
126        }
127
128    } // createBulkTestPersons()
129
130/*********************
131START OF TASK
132*********************/
133
134    def createBulkTestTasks() {
135
136        def taskResult
137        def p = [:]
138
139        def start = Task.count() + 1
140        def end = start + 10000
141
142        def range = start..end
143
144
145        def taskGroup1 = TaskGroup.get(1)
146        def taskPriority2 = TaskPriority.get(2)
147        def taskType1 = TaskType.get(1)
148        def leadPerson2 = Person.get(2)
149
150        def description = "Bulk test data "
151        String btDescription
152        def comment1 = "Has been noted as problematic, try recalibrating."
153        def today = dateUtilService.today
154
155        startTime = System.currentTimeMillis()
156        lastBatchStarted = startTime
157
158        range.each() {
159
160            if(it % 100 == 0) {
161                logStatus("Creating task #" + it)
162                cleanUpGorm()
163            }
164
165            btDescription = description + it
166
167            //Task #1
168            p = [taskGroup: taskGroup1,
169                    taskPriority: taskPriority2,
170                    taskType: taskType1,
171                    leadPerson: leadPerson2,
172                    description: btDescription,
173                    comment: comment1,
174                    targetStartDate: today]
175
176            taskResult = taskService.save(p)
177        }
178
179    }
180
181    def createBulkTestEntries() {
182
183        def entryResult
184        def p = [:]
185
186        def range = 1..10
187        def task1 = Task.get(1)
188        def entryType1 = EntryType.get(1)
189        def comment1 = "This is a bulk test entry."
190        def durationMinute1 = 20
191
192        range.each() {
193
194            p = [task: task1,
195                    entryType: entryType1,
196                    comment: comment1,
197                    durationMinute: durationMinute1]
198
199            entryResult = taskService.saveEntry(p)
200
201        }
202
203    } // createBulkTestEntries()
204
205    /**
206    * This cleans up the hibernate session and a grails map.
207    * For more info see: http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/
208    * The hibernate session flush is normal for hibernate.
209    * The map is apparently used by grails for domain object validation errors.
210    * A starting point for clean up is every 100 objects.
211    */
212    def cleanUpGorm() {
213        def session = sessionFactory.currentSession
214        session.flush()
215        session.clear()
216        propertyInstanceMap.get().clear()
217    }
218
219    def logStatus(String message) {
220        def batchEnded = System.currentTimeMillis()
221        def seconds = (batchEnded-lastBatchStarted)/1000
222        def total = (batchEnded-startTime)/1000
223        log.info "${message}, last: ${seconds}s, total: ${total}s"
224        lastBatchStarted = batchEnded
225    }
226
227
228/****************************************
229Call this function instead of .save()
230*****************************************/
231    private boolean saveAndTest(object) {
232        if(!object.save()) {
233//             BulkTestDataSuccessful = false
234            log.error "'${object}' failed to save!"
235            log.error object.errors
236            return false
237        }
238        return true
239    }
240
241} // end class.
Note: See TracBrowser for help on using the repository browser.