/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/edu-services/trunk/cm-service/cm-impl/hibernate-impl/impl/src/test/org/sakaiproject/coursemanagement/test/performance/IndexPerformance.java $
* $Id: IndexPerformance.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.coursemanagement.test.performance;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.coursemanagement.api.CourseManagementAdministration;
import org.sakaiproject.coursemanagement.api.CourseManagementService;
import org.sakaiproject.coursemanagement.api.Enrollment;
import org.sakaiproject.coursemanagement.api.Membership;
import org.sakaiproject.coursemanagement.api.Section;
import org.sakaiproject.coursemanagement.api.SectionCategory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class IndexPerformance {
private static final Log log = LogFactory.getLog(IndexPerformance.class);
private static final int secCount = 10;
private static final int enrollmentsPerEnrollmentSet = 100;
private static final int membersPerSection = 100;
private static final String esPrefix = "IndexPerf ES ";
private static final String secPrefix = "IndexPerf SEC ";
protected ApplicationContext appContext;
protected CourseManagementAdministration cmAdmin;
protected CourseManagementService cmService;
protected PlatformTransactionManager tm;
public IndexPerformance() {
init();
}
public void init() {
appContext = new ClassPathXmlApplicationContext(new String[] {"spring-test.xml", "spring-config-test.xml"});
cmAdmin = (CourseManagementAdministration)appContext.getBean(CourseManagementAdministration.class.getName());
cmService = (CourseManagementService)appContext.getBean(CourseManagementService.class.getName());
tm = (PlatformTransactionManager)appContext.getBean("cmTransactionManager");
}
public void loadLotsOfData() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = tm.getTransaction(def);
try {
String asId = "IndexPerf AS";
cmAdmin.createAcademicSession(asId, asId, asId, null, null);
String csId = "IndexPerf CS";
cmAdmin.createCourseSet(csId, csId, csId, "DEPT", null);
String ccId = "IndexPerf CC";
cmAdmin.createCanonicalCourse(ccId, ccId, ccId);
String coId = "IndecPerf CO";
cmAdmin.createCourseOffering(coId, csId, csId, "open", asId, ccId, null, null);
for(int i = 1; i <= secCount; i++) {
String esId = esPrefix + i;
Set<String> instructors = new HashSet<String>();
instructors.add("instructor_A_" + i);
instructors.add("instructor_B_" + i);
instructors.add("instructor_C_" + i);
cmAdmin.createEnrollmentSet(esId, esId, esId, "lecture", "3", coId, instructors);
}
for(int i = 1; i <= secCount; i++) {
String secId = secPrefix + i;
cmAdmin.createSection(secId, secId, secId, "lecture", null, coId, (esPrefix + i));
}
for(int i = 1; i <= secCount; i++) {
for(int j = 1; j <= enrollmentsPerEnrollmentSet; j++) {
cmAdmin.addOrUpdateEnrollment("student" + j, esPrefix + i, "enrolled", "3", "letter grade");
}
}
for(int i = 1; i <= secCount; i++) {
for(int j = 1; j <= membersPerSection; j++) {
cmAdmin.addOrUpdateSectionMembership("student" + j, "some role", secPrefix + i, "some status");
}
}
} catch (Exception e) {
tm.rollback(status);
} finally {
if(!status.isCompleted()) {
tm.commit(status);
}
}
}
public long getTimeToSelectEnrollments(String studentEid, String esEid) {
long start = System.currentTimeMillis();
Enrollment enr = cmService.findEnrollment(studentEid, esEid);
long end = System.currentTimeMillis();
return end - start;
}
public long getTimeToSelectMembers(String studentEid) {
long start = System.currentTimeMillis();
Map<String, String> roleMap = cmService.findSectionRoles(studentEid);
long end = System.currentTimeMillis();
return end - start;
}
public long getTimeToSelectInstructors(String instructorEid) {
long start = System.currentTimeMillis();
Set<Section> sections = cmService.findInstructingSections(instructorEid);
long end = System.currentTimeMillis();
return end - start;
}
// Static methods
public static void main(String[] args) {
IndexPerformance indexPerf = new IndexPerformance();
indexPerf.loadLotsOfData();
logEnrollmentSelects(indexPerf);
logMemberSelects(indexPerf);
logInstructorSelects(indexPerf);
}
private static void logEnrollmentSelects(IndexPerformance indexPerf) {
long total = 0;
for(int i = 1; i <= enrollmentsPerEnrollmentSet; i++) {
long thisRun = indexPerf.getTimeToSelectEnrollments("student" + i, esPrefix + 1);
total += thisRun;
}
double esMean = (double)total / (double)enrollmentsPerEnrollmentSet;
log.info("Mean time (in milliseconds) to select Enrollments:\t" + esMean);
}
private static void logMemberSelects(IndexPerformance indexPerf) {
long total = 0;
for(int i = 1; i <= membersPerSection; i++) {
long thisRun = indexPerf.getTimeToSelectMembers("student" + i);
total += thisRun;
}
double secMean = (double)total / (double)membersPerSection;
log.info("Mean time (in milliseconds) to select Memberships:\t" + secMean);
}
private static void logInstructorSelects(IndexPerformance indexPerf) {
long total = 0;
for(int i = 1; i <= secCount; i++) {
long thisRun = indexPerf.getTimeToSelectInstructors("instructor_B_" + i);
total += thisRun;
}
double secMean = (double)total / (double)secCount;
log.info("Mean time (in milliseconds) to select Instructors:\t" + secMean);
}
}