Have you implemented OpenMRS? Please participate in the Implementation Site Survey. If you already have, thank you!
Child pages
  • Chart Search for the Reference Application - Phase 2
Skip to end of metadata
Go to start of metadata

Abstract

One of the most useful aspects of an electronic medical record system is data retrieval. While OpenMRS has some mature tools for data collection and reporting, we still need a good tool for rapid perusal of patient data. Jonathan Cummins created a Chart Search tool for Regenstrief that uses SOLR to provide powerful, sub-second Google-like searching of a patient's record. Basing on this, the first version of Chart Search for the OpenMRS Reference Application platform was created during GSOC 2014. The goal of this project is to do the second phase of Chart Search for the OpenMRS Reference Application platform.

Project Champions

Objectives

  • Modify the current graph in the detailed display section to support zooming in and out to see details; Regenstrief uses: highcharts
  • Allow indexing other modules data and provide a custom way of displaying such indexed data on another page.
  • Redesign the chart search page, (will give details regarding how to improve the previous design)
  • The provider or doctor should be able to search and locate all data about the selected patient on the chart search page.
  • Leveraging SOLR to perform aggregate searches (e.g., find all visits across all patients during 2014 with a new diagnosis of diabetes).
  • Fix bugs and add new features noted at: https://notes.openmrs.org/ChartSearch-Module-Feedback and https://notes.openmrs.org/ChartSearch-Module-Feedback-Phase2
  • The chartsearch page needs to provide a way of saving previous searches plus the attached filter options (tagging) hence ability to add labels among other options of your choice. 
  • The chartsearch page should instead of returning all results at first loading return previous searches for the logged In user.
  • The module administration pages (such as: .../openmrs/module/chartsearch/*name*.form) are currently designed for the old legacy UI that will soon be separated from the OpenMRS Platform, Re-visit their functionality and design new pages providing their functionality within the reference application.
  • Re-factor the module's source code to remove any redundant code, classes and libraries (if there are any) introduced as a result of the previous module evolution.

Extra Credit

  • Create a migration pathway for people starting with Chart Search and embedded Lucene to migrate to a separate SOLR server

Resources

Child Pages

  • No labels

10 Comments

  1. I'm interested in contributing to this project. I tried the UAT links given relating to the previously developed module, but none of them are working. 
    If possible, please provide me a UAT link, so I could try and get familiar. 

    Thank You 

  2. Welcome Sriyan Indeewara aboard, for a demo site, i refer you to the http://devtest02.openmrs.org:8080/openmrs instead since UAT was just for a time

  3. No, Refer to Chart Search Module documentation about what you can do with the module and how (smile)

  4. Kaweesi Joseph I went through the documentation and the previous presentations. Now I'm trying to set up locally. 
    I tried with Openmrs version 1.9.x branch. But the view is different from http://devtest02.openmrs.org:8080/openmrs and gives an error "There was an error starting the module: Chart Search Module"
    What is the version that I should use?

  5. Hello,

    I am interested in the chart search project for gsoc2015. I went through the "getting started page" where i set up maven and git. I'am currently trying to work on a TO DO ticket, but finding a few problems.

    In the meantime, I read though the reference material in the above description, but am not sure where to start. I looked through the reference application, but wasnt able to find the chart search function. I also cloned the 2013 GSoC project in the link above. Please advise on how i should proceed working, because i have pretty much read a lot about openMRS. I dont have any experience in open source code projects, but i learn fast, so am all yours.

    Many Thanks 

  6. Welcome Mukisa, I would rather clone the 2014 current code from https://github.com/openmrs/openmrs-module-chartsearch if i were you (smile), however this looks to be the same code you cloned, may be the 2013 is coming from the resources being adopted from last year. The Chart Search Module documentation will let you find out where how to get to the chartsearch page.

    By the way, Power Mukisa is one  of the many students we have reached through the OpenMRS GSoC meet-ups in Kampala, welcome friend and thanks for your zeal

  7. Kaweesi Joseph: I'm trying to build openmrs as mentioned here. It builds fine, but when I start jetty I get the following error. 

    Can you help me to resolve this?

    ERROR - Listener.performWebStartOfModules(629) |2015-03-21 13:55:40,144| Unable to refresh the spring application context. Root Cause was:
    java.lang.LinkageError: loader constraint violation: loader (instance of org/openmrs/module/ModuleClassLoader) previously initiated loading for a different type with name "org/apache/commons/logging/Log"
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2436)
    at java.lang.Class.getDeclaredFields(Class.java:1806)
    at org.hibernate.annotations.common.reflection.java.JavaXClass.getDeclaredFieldProperties(JavaXClass.java:102)
    at org.hibernate.annotations.common.reflection.java.JavaXClass.getDeclaredProperties(JavaXClass.java:126)
    at org.hibernate.annotations.common.reflection.java.JavaXClass.getDeclaredProperties(JavaXClass.java:121)
    at org.hibernate.search.engine.AbstractDocumentBuilder.initializeClass(AbstractDocumentBuilder.java:382)
    at org.hibernate.search.engine.AbstractDocumentBuilder.<init>(AbstractDocumentBuilder.java:135)
    at org.hibernate.search.engine.DocumentBuilderContainedEntity.<init>(DocumentBuilderContainedEntity.java:57)
    at org.hibernate.search.spi.SearchFactoryBuilder.initDocumentBuilders(SearchFactoryBuilder.java:390)
    at org.hibernate.search.spi.SearchFactoryBuilder.buildNewSearchFactory(SearchFactoryBuilder.java:262)
    at org.hibernate.search.spi.SearchFactoryBuilder.buildSearchFactory(SearchFactoryBuilder.java:144)
    at org.hibernate.search.event.FullTextIndexEventListener.initialize(FullTextIndexEventListener.java:151)
    at org.hibernate.event.EventListeners$1.processListener(EventListeners.java:198)
    at org.hibernate.event.EventListeners.processListeners(EventListeners.java:181)
    at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:194)
    at org.hibernate.cfg.Configuration.getInitializedEventListeners(Configuration.java:2010)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)
    at org.openmrs.api.db.hibernate.HibernateSessionFactoryBean.afterPropertiesSet(HibernateSessionFactoryBean.java:201)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:101)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:359)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:409)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1518)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.context.support.AbstractApplicationContext.initMessageSource(AbstractApplicationContext.java:786)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467)
    at org.openmrs.module.ModuleUtil.refreshApplicationContext(ModuleUtil.java:836)
    at org.openmrs.module.web.WebModuleUtil.refreshWAC(WebModuleUtil.java:971)
    at org.openmrs.web.Listener.performWebStartOfModules(Listener.java:620)
    at org.openmrs.web.Listener.performWebStartOfModules(Listener.java:599)
    at org.openmrs.web.Listener.startOpenmrs(Listener.java:242)
    at org.openmrs.web.WebDaemon$1.run(WebDaemon.java:46)
    WARN - Listener.performWebStartOfModules(658) |2015-03-21 13:55:40,148| caught another error:
    org.openmrs.api.APIException: Service not found: interface org.openmrs.scheduler.SchedulerService
    at org.openmrs.api.context.ServiceContext.getService(ServiceContext.java:754)
    at org.openmrs.api.context.ServiceContext.getSchedulerService(ServiceContext.java:309)
    at org.openmrs.api.context.Context.getSchedulerService(Context.java:533)
    at org.openmrs.module.web.WebModuleUtil.stopTasks(WebModuleUtil.java:387)
    at org.openmrs.module.web.WebModuleUtil.stopModule(WebModuleUtil.java:866)
    at org.openmrs.module.web.WebModuleUtil.shutdownModules(WebModuleUtil.java:809)
    at org.openmrs.web.Listener.performWebStartOfModules(Listener.java:635)
    at org.openmrs.web.Listener.performWebStartOfModules(Listener.java:599)
    at org.openmrs.web.Listener.startOpenmrs(Listener.java:242)
    at org.openmrs.web.WebDaemon$1.run(WebDaemon.java:46)
    WARN - ModuleFactory.stopModule(1087) |2015-03-21 13:55:40,149| Unable to call module's Activator.willStop() method
    org.openmrs.api.APIException: Service not found: interface org.openmrs.module.atlas.AtlasService
    at org.openmrs.api.context.ServiceContext.getService(ServiceContext.java:754)
    at org.openmrs.api.context.Context.getService(Context.java:978)
    at org.openmrs.module.atlas.AtlasModuleActivator.willStop(AtlasModuleActivator.java:66)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1083)
    at org.openmrs.module.ModuleUtil.shutdown(ModuleUtil.java:165)
    at org.openmrs.api.context.Context.shutdown(Context.java:946)
    at org.openmrs.web.Listener.startOpenmrs(Listener.java:248)
    at org.openmrs.web.WebDaemon$1.run(WebDaemon.java:46)
    WARN - ModuleFactory.stopModule(1164) |2015-03-21 13:55:40,165| Unable to call module's Activator.shutdown() method
    org.openmrs.api.APIException: Service not found: interface org.openmrs.module.appframework.service.AppFrameworkService
    at org.openmrs.api.context.ServiceContext.getService(ServiceContext.java:754)
    at org.openmrs.api.context.Context.getService(Context.java:978)
    at org.openmrs.module.referenceapplication.ReferenceApplicationActivator.stopped(ReferenceApplicationActivator.java:230)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1158)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1076)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1076)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1076)
    at org.openmrs.module.ModuleUtil.shutdown(ModuleUtil.java:165)
    at org.openmrs.api.context.Context.shutdown(Context.java:946)
    at org.openmrs.web.Listener.startOpenmrs(Listener.java:248)
    at org.openmrs.web.WebDaemon$1.run(WebDaemon.java:46)
    Exception in thread "Thread-16" java.lang.LinkageError: loader constraint violation: loader (instance of org/openmrs/module/ModuleClassLoader) previously initiated loading for a different type with name "org/apache/commons/logging/Log"
    at org.openmrs.module.htmlformentryui.HTMLFormEntryUIFrameworkIntegrationActivator.stopped(HTMLFormEntryUIFrameworkIntegrationActivator.java:57)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1158)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1076)
    at org.openmrs.module.ModuleFactory.stopModule(ModuleFactory.java:1076)
    at org.openmrs.module.ModuleUtil.shutdown(ModuleUtil.java:165)
    at org.openmrs.api.context.Context.shutdown(Context.java:946)
    at org.openmrs.web.Listener.startOpenmrs(Listener.java:248)
    at org.openmrs.web.WebDaemon$1.run(WebDaemon.java:46)
    WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2673) |2015-03-21 13:55:40,311| Unable to find a runtime properties file at /home/tharindu/Documents/git/sriyan/openmrs-core/webapp/openmrs-runtime.properties
    INFO 3/21/15 1:55 PM:liquibase: Reading from `liquibasechangelog`
    WARNING 3/21/15 1:55 PM:liquibase: modifyDataType will lose primary key/autoincrement/not null settings for mysql. Use <sql> and re-specify all configuration if this is the case
    WARNING 3/21/15 1:55 PM:liquibase: modifyDataType will lose primary key/autoincrement/not null settings for mysql. Use <sql> and re-specify all configuration if this is the case
    WARNING 3/21/15 1:55 PM:liquibase: modifyDataType will lose primary key/autoincrement/not null settings for mysql. Use <sql> and re-specify all configuration if this is the case
    INFO 3/21/15 1:55 PM:liquibase: Reading from `liquibasechangelog`
    WARNING 3/21/15 1:55 PM:liquibase: modifyDataType will lose primary key/autoincrement/not null settings for mysql. Use <sql> and re-specify all configuration if this is the case
    WARNING 3/21/15 1:55 PM:liquibase: modifyDataType will lose primary key/autoincrement/not null settings for mysql. Use <sql> and re-specify all configuration if this is the case
    WARNING 3/21/15 1:55 PM:liquibase: modifyDataType will lose primary key/autoincrement/not null settings for mysql. Use <sql> and re-specify all configuration if this is the case
    [INFO] Started SelectChannelConnector@0.0.0.0:8080
    [INFO] Started Jetty Server
    [INFO] Starting scanner at interval of 10 seconds.

  8. Sriyan Indeewara can we chat about this on IRC?

  9. If it's showing up after you loaded chartsearch Sriyan Indeewara, then you can try setting up 2.x using openmrs platform 1.11.1-SNAPSHOT instead, but as Daniel Kayiwa has mentioned, better off to have you on IRC and have a more interactive session with him about it. Still am requesting you to get the log onto pastebin and just link the url into your comment rather than having it lengthen this page (smile)