Browse Source

Basic search for CORPUS

develop
LO Kam Tao Leo 3 years ago
parent
commit
3400f84628
  1. 5
      pom.xml
  2. 22
      src/main/java/org/leolo/nrdatad/App.java
  3. 14
      src/main/java/org/leolo/nrdatad/db/BaseDao.java
  4. 53
      src/main/java/org/leolo/nrdatad/db/CORPUSDao.java
  5. 53
      src/main/java/org/leolo/nrdatad/db/ParameterStore.java
  6. 10
      src/main/java/org/leolo/nrdatad/db/SearchMode.java
  7. 79
      src/main/java/org/leolo/nrdatad/db/mariadb/CORPUSDao.java
  8. 13
      src/main/java/org/leolo/nrdatad/model/CORPUS.java

5
pom.xml

@ -72,6 +72,11 @@
<artifactId>json</artifactId>
<version>20220924</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
</dependencies>

22
src/main/java/org/leolo/nrdatad/App.java

@ -4,13 +4,17 @@ package org.leolo.nrdatad;
import org.apache.commons.cli.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.leolo.nrdatad.db.CORPUSDao;
import org.leolo.nrdatad.db.DatabaseManager;
import org.leolo.nrdatad.cron.ReferenceDataJob;
import org.leolo.nrdatad.model.CORPUS;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Collection;
/**
* Hello world!
@ -90,9 +94,27 @@ public class App {
return;
}
loadCronJob();
new Thread(()->{testRefData();}).start();
while(true);
}
private void testRefData() {
log.atInfo().log("Testing reference data");
ConfigurationManager conf = ConfigurationManager.getInstance();
CORPUSDao.Query query = new CORPUSDao.QueryBuilder()
.addCrsCode("ECR").addCrsCode("VIC")
.addDescription("croydon").build();
try {
Collection<CORPUS> list = conf.getDatabaseManager().getCORPUSDao().executeQuery(query);
log.atDebug().log("{} entries found", list.size());
for(CORPUS corpus:list){
log.atDebug().log("Found entry : {}", corpus);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
private void loadCronJob() {
log.atDebug().log("Start loading cron jobs");
try {

14
src/main/java/org/leolo/nrdatad/db/BaseDao.java

@ -27,4 +27,18 @@ public abstract class BaseDao {
}
}
protected String getQueryParams(int count){
if(count <= 0){
throw new IllegalArgumentException("count must be greater than 0");
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<count;i++){
if(i>0){
sb.append(",");
}
sb.append("?");
}
return sb.toString();
}
}

53
src/main/java/org/leolo/nrdatad/db/CORPUSDao.java

@ -1,12 +1,10 @@
package org.leolo.nrdatad.db;
import org.apache.commons.collections4.SetUtils;
import org.leolo.nrdatad.model.CORPUS;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
public abstract class CORPUSDao extends BaseDao{
@ -23,32 +21,39 @@ public abstract class CORPUSDao extends BaseDao{
private Set<String> description = new HashSet<>();
SearchMode searchMode = SearchMode.MATCH_ALL_GROUP;
public void setSearchMode(SearchMode searchMode) {
public QueryBuilder setSearchMode(SearchMode searchMode) {
this.searchMode = searchMode;
return this;
}
public void addStanox(String stanox){
public QueryBuilder addStanox(String stanox){
this.stanox.add(stanox);
return this;
}
public void addUicCode(String uicCode){
public QueryBuilder addUicCode(String uicCode){
this.uicCode.add(uicCode);
return this;
}
public void addCrsCode(String crsCode){
public QueryBuilder addCrsCode(String crsCode){
this.crsCode.add(crsCode);
return this;
}
public void addTiplocCode(String tiplocCode){
public QueryBuilder addTiplocCode(String tiplocCode){
this.tiplocCode.add(tiplocCode);
return this;
}
public void addNlcCode(String nlcCode){
public QueryBuilder addNlcCode(String nlcCode){
this.nlcCode.add(nlcCode);
return this;
}
public void addDescription(String description){
public QueryBuilder addDescription(String description){
this.description.add(description);
return this;
}
public Query build(){
@ -66,40 +71,40 @@ public abstract class CORPUSDao extends BaseDao{
SearchMode searchMode = SearchMode.MATCH_ALL_GROUP;
private Query(Set<String> stanox, Set<String> uicCode, Set<String> crsCode, Set<String> tiplocCode, Set<String> nlcCode, Set<String> description, SearchMode searchMode) {
this.stanox = stanox;
this.uicCode = uicCode;
this.crsCode = crsCode;
this.tiplocCode = tiplocCode;
this.nlcCode = nlcCode;
this.description = description;
this.stanox = Collections.unmodifiableSet(stanox);
this.uicCode = Collections.unmodifiableSet(uicCode);
this.crsCode = Collections.unmodifiableSet(crsCode);
this.tiplocCode = Collections.unmodifiableSet(tiplocCode);
this.nlcCode = Collections.unmodifiableSet(nlcCode);
this.description = Collections.unmodifiableSet(description);
this.searchMode = searchMode;
}
protected Set<String> getStanox() {
public Set<String> getStanox() {
return stanox;
}
protected Set<String> getUicCode() {
public Set<String> getUicCode() {
return uicCode;
}
protected Set<String> getCrsCode() {
public Set<String> getCrsCode() {
return crsCode;
}
protected Set<String> getTiplocCode() {
public Set<String> getTiplocCode() {
return tiplocCode;
}
protected Set<String> getNlcCode() {
public Set<String> getNlcCode() {
return nlcCode;
}
protected Set<String> getDescription() {
public Set<String> getDescription() {
return description;
}
protected SearchMode getSearchMode() {
public SearchMode getSearchMode() {
return searchMode;
}
}

53
src/main/java/org/leolo/nrdatad/db/ParameterStore.java

@ -0,0 +1,53 @@
package org.leolo.nrdatad.db;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ParameterStore extends ArrayList<String> {
@Override
public int indexOf(Object o) {
return super.indexOf(o)+1;
}
@Override
public int lastIndexOf(Object o) {
return super.lastIndexOf(o)+1;
}
@Override
public String get(int index) {
return super.get(index-1);
}
@Override
public String set(int index, String element) {
return super.set(index-1, element);
}
@Override
public void add(int index, String element) {
super.add(index-1, element);
}
@Override
public String remove(int index) {
return super.remove(index-1);
}
@Override
public boolean addAll(int index, Collection<? extends String> c) {
return super.addAll(index-1, c);
}
@Override
protected void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex-1, toIndex-1);
}
@Override
public List<String> subList(int fromIndex, int toIndex) {
return super.subList(fromIndex-1, toIndex-1);
}
}

10
src/main/java/org/leolo/nrdatad/db/SearchMode.java

@ -1,7 +1,17 @@
package org.leolo.nrdatad.db;
public enum SearchMode {
/**
* Indicate all condition must be matched
*/
MATCH_ALL,
/**
* Indicate at least one condition in every group must be matched
*/
MATCH_ALL_GROUP,
/**
* Indicate at least one condition must be matched.
*/
MATCH_ANY;
}

79
src/main/java/org/leolo/nrdatad/db/mariadb/CORPUSDao.java

@ -4,13 +4,12 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.leolo.nrdatad.db.DatabaseManager;
import org.leolo.nrdatad.db.ParameterStore;
import org.leolo.nrdatad.db.SearchMode;
import org.leolo.nrdatad.model.CORPUS;
import java.sql.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import java.util.*;
public class CORPUSDao extends org.leolo.nrdatad.db.CORPUSDao {
@ -22,7 +21,77 @@ public class CORPUSDao extends org.leolo.nrdatad.db.CORPUSDao {
@Override
public Collection<CORPUS> executeQuery(org.leolo.nrdatad.db.CORPUSDao.Query query) throws SQLException {
return null;
Vector<CORPUS> corpuses = new Vector<>();
ParameterStore params = new ParameterStore();
StringBuilder sql = new StringBuilder();
if(query.getSearchMode()== SearchMode.MATCH_ALL_GROUP || query.getSearchMode()==SearchMode.MATCH_ANY){
sql.append("SELECT * FROM corpus WHERE ");
String keyWord;
if(query.getSearchMode() == SearchMode.MATCH_ALL_GROUP){
sql.append("1=1 ");
keyWord = "AND ";
}else{
sql.append("1=0 ");
keyWord = "OR ";
}
if(query.getStanox().size()>0){
sql.append(keyWord).append("stanox IN (")
.append(getQueryParams(query.getStanox().size())).append(") ");
params.addAll(query.getStanox());
}
if(query.getUicCode().size()>0){
sql.append(keyWord).append("uic_code IN (")
.append(getQueryParams(query.getUicCode().size())).append(") ");
params.addAll(query.getUicCode());
}
if(query.getCrsCode().size()>0){
sql.append(keyWord).append("crs_code IN (")
.append(getQueryParams(query.getCrsCode().size())).append(") ");
params.addAll(query.getCrsCode());
}
if(query.getTiplocCode().size()>0){
sql.append(keyWord).append("tiploc_code IN (")
.append(getQueryParams(query.getTiplocCode().size())).append(") ");
params.addAll(query.getTiplocCode());
}
if(query.getNlcCode().size()>0){
sql.append(keyWord).append("nlc_code IN(")
.append(getQueryParams(query.getNlcCode().size())).append(") ");
params.addAll(query.getNlcCode());
}
if(query.getDescription().size()>0){
sql.append(keyWord).append("(");
boolean hasDesc = false;
for(String str:query.getDescription()){
if(hasDesc){
sql.append("OR ");
}
sql.append("(`desc` LIKE ? OR short_desc LIKE ? ) ");
hasDesc = true;
params.add("%"+str+"%");
params.add("%"+str+"%");
}
sql.append(") ");
}
log.atDebug().log("SQL={}",sql);
}else{
log.always().log("Search mode {} is yet to be implemented.", query.getSearchMode());
}
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql.toString())
){
for(int i=1;i<=params.size();i++){
log.atDebug().log("Param {} = {}", i, params.get(i));
setString(pstmt, i, params.get(i));
}
try(ResultSet rs = pstmt.executeQuery()){
while(rs.next()){
corpuses.add(parseCORPUS(rs));
}
}
}
return corpuses;
}
@Override

13
src/main/java/org/leolo/nrdatad/model/CORPUS.java

@ -81,4 +81,17 @@ public class CORPUS {
public int hashCode() {
return Objects.hash(stanoxCode, uicCode, crsCode, tiplocCode, nlcCode, longDescription, shortDescription);
}
@Override
public String toString() {
return "CORPUS{" +
"stanoxCode='" + stanoxCode + '\'' +
", uicCode='" + uicCode + '\'' +
", crsCode='" + crsCode + '\'' +
", tiplocCode='" + tiplocCode + '\'' +
", nlcCode='" + nlcCode + '\'' +
", longDescription='" + longDescription + '\'' +
", shortDescription='" + shortDescription + '\'' +
'}';
}
}

Loading…
Cancel
Save