=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/patient/PatientStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/patient/PatientStore.java 2013-09-20 03:13:45 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/patient/PatientStore.java 2013-09-27 13:56:18 +0000 @@ -56,6 +56,8 @@ Collection getByOrgUnit( OrganisationUnit organisationUnit, Integer min, Integer max ); + Collection getByOrgUnitAndNameLike( OrganisationUnit organisationUnit, String nameLike, Integer min, Integer max ); + Collection getByOrgUnitAndGender( OrganisationUnit organisationUnit, String gender, Integer min, Integer max ); Collection getByOrgUnitProgram( OrganisationUnit organisationUnit, Program program, Integer min, === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/person/AbstractPersonService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/person/AbstractPersonService.java 2013-09-27 11:33:03 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/person/AbstractPersonService.java 2013-09-27 13:56:18 +0000 @@ -152,6 +152,13 @@ } @Override + public Persons getPersons( OrganisationUnit organisationUnit, String nameLike ) + { + List patients = new ArrayList( patientService.getPatientsLikeName( organisationUnit, nameLike, 0, Integer.MAX_VALUE ) ); + return getPersons( patients ); + } + + @Override public Persons getPersons( Gender gender ) { List patients = new ArrayList( patientService.getPatiensByGender( gender.getValue() ) ); === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/person/PersonService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/person/PersonService.java 2013-09-27 10:43:38 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/person/PersonService.java 2013-09-27 13:56:18 +0000 @@ -56,6 +56,8 @@ Persons getPersons( OrganisationUnit organisationUnit ); + Persons getPersons( OrganisationUnit organisationUnit, String nameLike ); + Persons getPersons( Gender gender ); Persons getPersons( Program program ); === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/DefaultPatientService.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/DefaultPatientService.java 2013-09-27 11:13:20 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/DefaultPatientService.java 2013-09-27 13:56:18 +0000 @@ -260,7 +260,7 @@ public Collection getPatientsForMobile( String searchText, int orgUnitId ) { Set patients = new HashSet(); - patients.addAll( patientIdentifierService.getPatientsByIdentifier( searchText, 0, Integer.MAX_VALUE) ); + patients.addAll( patientIdentifierService.getPatientsByIdentifier( searchText, 0, Integer.MAX_VALUE ) ); patients.addAll( getPatientsByNames( searchText, null, null ) ); patients.addAll( getPatientsByPhone( searchText, null, null ) ); @@ -349,19 +349,9 @@ } @Override - public Collection getPatientsLikeName( OrganisationUnit organisationUnit, String name, Integer min, - Integer max ) + public Collection getPatientsLikeName( OrganisationUnit organisationUnit, String name, Integer min, Integer max ) { - Collection patients = new ArrayList(); - - Collection allPatients = getPatientsByNames( name, min, max ); - - if ( allPatients.retainAll( getPatients( organisationUnit, min, max ) ) ) - { - patients = allPatients; - } - - return patients; + return patientStore.getByOrgUnitAndNameLike( organisationUnit, name, min, max ); } @Override @@ -377,10 +367,11 @@ } else if ( identifierTypeId != null ) { - PatientIdentifierType idenType = patientIdentifierTypeService.getPatientIdentifierType( identifierTypeId ); - if ( idenType != null ) + PatientIdentifierType identifierType = patientIdentifierTypeService.getPatientIdentifierType( identifierTypeId ); + + if ( identifierType != null ) { - Patient p = patientIdentifierService.getPatient( idenType, value ); + Patient p = patientIdentifierService.getPatient( identifierType, value ); if ( p != null ) { Set set = new HashSet(); === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/hibernate/HibernatePatientStore.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/hibernate/HibernatePatientStore.java 2013-09-20 03:13:45 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/hibernate/HibernatePatientStore.java 2013-09-27 13:56:18 +0000 @@ -28,14 +28,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.List; - import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Conjunction; @@ -61,6 +53,14 @@ import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.transaction.annotation.Transactional; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; + /** * @author Abyot Asalefew Gizaw */ @@ -98,7 +98,7 @@ // Implementation methods // ------------------------------------------------------------------------- - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") @Override public Collection getByGender( String gender ) { @@ -106,7 +106,7 @@ } @Override - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") public Collection getByBirthDate( Date birthDate ) { return getCriteria( Restrictions.eq( "birthDate", birthDate ) ).list(); @@ -115,50 +115,24 @@ @Override public Collection getByNames( String fullName, Integer min, Integer max ) { - List patients = new ArrayList(); - - fullName = fullName.toLowerCase(); - String sql = "SELECT patientid FROM patient where lower( name ) " + "like '%" + fullName + "%'"; - - if ( min != null && max != null ) - { - sql += statementBuilder.limitRecord( min, max ); - } - - try - { - patients = jdbcTemplate.query( sql, new RowMapper() - { - public Patient mapRow( ResultSet rs, int rowNum ) - throws SQLException - { - return get( rs.getInt( 1 ) ); - } - } ); - } - catch ( Exception ex ) - { - ex.printStackTrace(); - } - - return patients; + return getAllLikeNameOrderedName( fullName, min, max ); } @Override - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") public Collection get( String name, Date birthdate, String gender ) { - Criteria crit = getCriteria(); + Criteria criteria = getCriteria(); Conjunction con = Restrictions.conjunction(); con.add( Restrictions.ilike( "name", name ) ); con.add( Restrictions.eq( "gender", gender ) ); con.add( Restrictions.eq( "birthDate", birthdate ) ); - crit.add( con ); - - crit.addOrder( Order.asc( "name" ) ); - - return crit.list(); + criteria.add( con ); + + criteria.addOrder( Order.asc( "name" ) ); + + return criteria.list(); } @Override @@ -178,7 +152,26 @@ } @Override - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") + public Collection getByOrgUnitAndNameLike( OrganisationUnit organisationUnit, String nameLike, Integer min, Integer max ) + { + String hql = "select p from Patient p where p.organisationUnit = :organisationUnit " + + " and lower(p.name) like :nameLike" + + " order by p.name"; + + Query query = getQuery( hql ); + query.setEntity( "organisationUnit", organisationUnit ); + query.setString( "nameLike", "%" + nameLike.toLowerCase() + "%" ); + + if ( min != null && max != null ) + { + query.setFirstResult( min ).setMaxResults( max ); + } + return query.list(); + } + + @Override + @SuppressWarnings("unchecked") public Collection getByOrgUnitAndGender( OrganisationUnit organisationUnit, String gender, Integer min, Integer max ) { @@ -304,7 +297,7 @@ String sql = "select p.patientid from patient p join programinstance pi on p.patientid=pi.patientid " + "where pi.programid=" + program.getId() + " and pi.status=" + ProgramInstance.STATUS_ACTIVE + " and p.gender='" + gender + "'"; - + if ( min != null && max != null ) { sql += statementBuilder.limitRecord( min, max ); @@ -351,18 +344,18 @@ } @Override - @SuppressWarnings( "deprecation" ) + @SuppressWarnings("deprecation") public int countGetPatientsByOrgUnitProgram( OrganisationUnit organisationUnit, Program program ) { String sql = "select count(p.patientid) from patient p join programinstance pi on p.patientid=pi.patientid " + "where p.organisationunitid=" + organisationUnit.getId() + " and pi.programid=" + program.getId() + " and pi.status=" + ProgramInstance.STATUS_ACTIVE; - + return jdbcTemplate.queryForInt( sql ); } @Override - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") public Collection getRepresentatives( Patient patient ) { String hql = "select distinct p from Patient p where p.representative = :representative order by p.id DESC"; @@ -632,103 +625,103 @@ int statusEvent = Integer.parseInt( keys[index] ); switch ( statusEvent ) { - case ProgramStageInstance.COMPLETED_STATUS: - patientWhere += condition + operatorStatus - + "( psi.executiondate is not null and psi.executiondate>='" + keys[2] - + "' and psi.executiondate<='" + keys[3] + "' and psi.completed=true "; - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - patientWhere += " and psi.organisationunitid in( " - + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - patientWhere += " and psi.organisationunitid=" + keys[4]; - } - patientWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.VISITED_STATUS: - patientWhere += condition + operatorStatus - + "( psi.executiondate is not null and psi.executiondate>='" + keys[2] - + "' and psi.executiondate<='" + keys[3] + "' and psi.completed=false "; + case ProgramStageInstance.COMPLETED_STATUS: + patientWhere += condition + operatorStatus + + "( psi.executiondate is not null and psi.executiondate>='" + keys[2] + + "' and psi.executiondate<='" + keys[3] + "' and psi.completed=true "; + // get events by orgunit children + if ( keys[4].equals( "-1" ) ) + { + patientWhere += " and psi.organisationunitid in( " + + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; + } + // get events by selected orgunit + else if ( !keys[4].equals( "0" ) ) + { + patientWhere += " and psi.organisationunitid=" + keys[4]; + } + patientWhere += ")"; + operatorStatus = " OR "; + condition = ""; + continue; + case ProgramStageInstance.VISITED_STATUS: + patientWhere += condition + operatorStatus + + "( psi.executiondate is not null and psi.executiondate>='" + keys[2] + + "' and psi.executiondate<='" + keys[3] + "' and psi.completed=false "; - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - patientWhere += " and psi.organisationunitid in( " - + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - patientWhere += " and psi.organisationunitid=" + keys[4]; - } - patientWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.FUTURE_VISIT_STATUS: - patientWhere += condition + operatorStatus + "( psi.executiondate is null and psi.duedate>='" - + keys[2] + "' and psi.duedate<='" + keys[3] - + "' and psi.status is null and (DATE(now()) - DATE(psi.duedate) <= 0) "; - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - patientWhere += " and p.organisationunitid in( " - + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - patientWhere += " and p.organisationunitid=" + keys[4]; - } - patientWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.LATE_VISIT_STATUS: - patientWhere += condition + operatorStatus + "( psi.executiondate is null and psi.duedate>='" - + keys[2] + "' and psi.duedate<='" + keys[3] - + "' and psi.status is null and (DATE(now()) - DATE(psi.duedate) > 0) "; - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - patientWhere += " and p.organisationunitid in( " - + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - patientWhere += " and p.organisationunitid=" + keys[4]; - } - patientWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - case ProgramStageInstance.SKIPPED_STATUS: - patientWhere += condition + operatorStatus + "( psi.status=5 and psi.duedate>='" + keys[2] - + "' and psi.duedate<='" + keys[3] + "' "; - // get events by orgunit children - if ( keys[4].equals( "-1" ) ) - { - patientWhere += " and psi.organisationunitid in( " - + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; - } - // get events by selected orgunit - else if ( !keys[4].equals( "0" ) ) - { - patientWhere += " and p.organisationunitid=" + keys[4]; - } - patientWhere += ")"; - operatorStatus = " OR "; - condition = ""; - continue; - default: - continue; + // get events by orgunit children + if ( keys[4].equals( "-1" ) ) + { + patientWhere += " and psi.organisationunitid in( " + + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; + } + // get events by selected orgunit + else if ( !keys[4].equals( "0" ) ) + { + patientWhere += " and psi.organisationunitid=" + keys[4]; + } + patientWhere += ")"; + operatorStatus = " OR "; + condition = ""; + continue; + case ProgramStageInstance.FUTURE_VISIT_STATUS: + patientWhere += condition + operatorStatus + "( psi.executiondate is null and psi.duedate>='" + + keys[2] + "' and psi.duedate<='" + keys[3] + + "' and psi.status is null and (DATE(now()) - DATE(psi.duedate) <= 0) "; + // get events by orgunit children + if ( keys[4].equals( "-1" ) ) + { + patientWhere += " and p.organisationunitid in( " + + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; + } + // get events by selected orgunit + else if ( !keys[4].equals( "0" ) ) + { + patientWhere += " and p.organisationunitid=" + keys[4]; + } + patientWhere += ")"; + operatorStatus = " OR "; + condition = ""; + continue; + case ProgramStageInstance.LATE_VISIT_STATUS: + patientWhere += condition + operatorStatus + "( psi.executiondate is null and psi.duedate>='" + + keys[2] + "' and psi.duedate<='" + keys[3] + + "' and psi.status is null and (DATE(now()) - DATE(psi.duedate) > 0) "; + // get events by orgunit children + if ( keys[4].equals( "-1" ) ) + { + patientWhere += " and p.organisationunitid in( " + + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; + } + // get events by selected orgunit + else if ( !keys[4].equals( "0" ) ) + { + patientWhere += " and p.organisationunitid=" + keys[4]; + } + patientWhere += ")"; + operatorStatus = " OR "; + condition = ""; + continue; + case ProgramStageInstance.SKIPPED_STATUS: + patientWhere += condition + operatorStatus + "( psi.status=5 and psi.duedate>='" + keys[2] + + "' and psi.duedate<='" + keys[3] + "' "; + // get events by orgunit children + if ( keys[4].equals( "-1" ) ) + { + patientWhere += " and psi.organisationunitid in( " + + TextUtils.getCommaDelimitedString( orgunitChilrenIds ) + " )"; + } + // get events by selected orgunit + else if ( !keys[4].equals( "0" ) ) + { + patientWhere += " and p.organisationunitid=" + keys[4]; + } + patientWhere += ")"; + operatorStatus = " OR "; + condition = ""; + continue; + default: + continue; } } if ( condition.isEmpty() ) @@ -749,20 +742,20 @@ int statusEvent = Integer.parseInt( keys[2] ); switch ( statusEvent ) { - case ProgramStageInstance.COMPLETED_STATUS: - patientWhere += "psi.completed=true"; - break; - case ProgramStageInstance.VISITED_STATUS: - patientWhere += "psi.executiondate is not null and psi.completed=false"; - break; - case ProgramStageInstance.FUTURE_VISIT_STATUS: - patientWhere += "psi.executiondate is null and psi.duedate >= now()"; - break; - case ProgramStageInstance.LATE_VISIT_STATUS: - patientWhere += "psi.executiondate is null and psi.duedate < now()"; - break; - default: - break; + case ProgramStageInstance.COMPLETED_STATUS: + patientWhere += "psi.completed=true"; + break; + case ProgramStageInstance.VISITED_STATUS: + patientWhere += "psi.executiondate is not null and psi.completed=false"; + break; + case ProgramStageInstance.FUTURE_VISIT_STATUS: + patientWhere += "psi.executiondate is null and psi.duedate >= now()"; + break; + case ProgramStageInstance.LATE_VISIT_STATUS: + patientWhere += "psi.executiondate is null and psi.duedate < now()"; + break; + default: + break; } patientWhere += " and pgi.status=" + ProgramInstance.STATUS_ACTIVE + " "; @@ -831,7 +824,7 @@ } @Override - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") public Collection getByPhoneNumber( String phoneNumber, Integer min, Integer max ) { String hql = "select p from Patient p where p.phoneNumber like '%" + phoneNumber + "%'"; @@ -877,7 +870,7 @@ return patients; } - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") public Collection getRegistrationOrgunitIds( Date startDate, Date endDate ) { Criteria criteria = getCriteria(); === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/PersonController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/PersonController.java 2013-09-27 11:42:42 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/event/PersonController.java 2013-09-27 13:56:18 +0000 @@ -88,6 +88,7 @@ @RequestParam( value = "program", required = false ) String programUid, @RequestParam( required = false ) String identifierType, @RequestParam( required = false ) String identifier, + @RequestParam( required = false ) String nameLike, @RequestParam Map parameters, Model model, HttpServletRequest request ) throws Exception { WebOptions options = new WebOptions( parameters ); @@ -100,7 +101,12 @@ } else if ( orgUnitUid != null ) { - if ( programUid != null && gender != null ) + if ( nameLike != null ) + { + OrganisationUnit organisationUnit = getOrganisationUnit( orgUnitUid ); + persons = personService.getPersons( organisationUnit, nameLike ); + } + else if ( programUid != null && gender != null ) { OrganisationUnit organisationUnit = getOrganisationUnit( orgUnitUid ); Program program = getProgram( programUid ); @@ -124,6 +130,10 @@ persons = personService.getPersons( organisationUnit ); } } + else + { + throw new HttpClientErrorException( HttpStatus.BAD_REQUEST, "Missing required orgUnit parameter." ); + } model.addAttribute( "model", persons ); model.addAttribute( "viewClass", options.getViewClass( "basic" ) );