implemented full-text search
This commit is contained in:
@@ -201,7 +201,6 @@ public class CompanyModule extends BaseHandler implements CompanyService {
|
|||||||
var json = json(ex);
|
var json = json(ex);
|
||||||
if (!(json.has(KEY) && json.get(KEY) instanceof String key)) throw missingFieldException(KEY);
|
if (!(json.has(KEY) && json.get(KEY) instanceof String key)) throw missingFieldException(KEY);
|
||||||
var keys = Arrays.asList(key.split(" "));
|
var keys = Arrays.asList(key.split(" "));
|
||||||
var fulltext = json.has(FULLTEXT) && json.get(FULLTEXT) instanceof Boolean val && val;
|
|
||||||
var companies = companyDb.find(user.id(),keys);
|
var companies = companyDb.find(user.id(),keys);
|
||||||
return sendContent(ex,mapValues(companies));
|
return sendContent(ex,mapValues(companies));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -338,12 +338,32 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|||||||
rs.close();
|
rs.close();
|
||||||
|
|
||||||
var query = Query.select(ALL).from(TABLE_DOCUMENTS).where(COMPANY_ID,in(companyIds.toArray()));
|
var query = Query.select(ALL).from(TABLE_DOCUMENTS).where(COMPANY_ID,in(companyIds.toArray()));
|
||||||
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4},\" \",{5},\" \",{6},\" \",{7},\" \",{8},\" \",{9})",NUMBER,FIELD_HEAD,FIELD_FOOTER,SENDER,FIELD_TAX_NUMBER,FIELD_BANK_ACCOUNT,FIELD_CUSTOMER,FIELD_CUSTOMER_NUMBER,FIELD_CUSTOMER_TAX_NUMBER,FIELD_CUSTOMER_EMAIL),like("%"+key+"%"));
|
if (fulltext) {
|
||||||
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4},\" \",{5},\" \",{6},\" \",{7},\" \",{8},\" \",{9})",NUMBER,FIELD_HEAD,FIELD_FOOTER,SENDER,FIELD_TAX_NUMBER,FIELD_BANK_ACCOUNT,FIELD_CUSTOMER,FIELD_CUSTOMER_NUMBER,FIELD_CUSTOMER_TAX_NUMBER,FIELD_CUSTOMER_EMAIL),like("%"+key+"%"));
|
||||||
|
} else {
|
||||||
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4})",NUMBER,FIELD_HEAD,FIELD_FOOTER,SENDER,FIELD_CUSTOMER),like("%"+key+"%"));
|
||||||
|
}
|
||||||
rs = query.exec(db);
|
rs = query.exec(db);
|
||||||
var map = new HashMap<Long,Document>();
|
var map = new HashMap<Long,Document>();
|
||||||
while (rs.next()) map.put(rs.getLong(ID),toDoc(rs,types));
|
while (rs.next()) map.put(rs.getLong(ID),toDoc(rs,types));
|
||||||
rs.close();
|
rs.close();
|
||||||
|
|
||||||
|
if (fulltext){
|
||||||
|
var additionalDocIds = new HashSet<Long>();
|
||||||
|
query = select(FIELD_DOCUMENT_ID).from(TABLE_POSITIONS).leftJoin(FIELD_DOCUMENT_ID,TABLE_DOCUMENTS,ID).where(COMPANY_ID,in(companyIds.toArray()));
|
||||||
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3})",FIELD_ITEM_CODE,UNIT,TITLE,DESCRIPTION),like("%"+key+"%"));
|
||||||
|
rs = query.exec(db);
|
||||||
|
while (rs.next()) additionalDocIds.add(rs.getLong(FIELD_DOCUMENT_ID));
|
||||||
|
rs.close();
|
||||||
|
|
||||||
|
additionalDocIds.removeAll(map.keySet());
|
||||||
|
|
||||||
|
query = select(ALL).from(TABLE_DOCUMENTS).where(ID,in(additionalDocIds.toArray()));
|
||||||
|
rs = query.exec(db);
|
||||||
|
while (rs.next()) map.put(rs.getLong(ID),toDoc(rs,types));
|
||||||
|
rs.close();
|
||||||
|
}
|
||||||
|
|
||||||
rs = Query.select(ALL).from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID,in(map.keySet().toArray())).exec(db);
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID,in(map.keySet().toArray())).exec(db);
|
||||||
while (rs.next()){
|
while (rs.next()){
|
||||||
var docId = rs.getLong(FIELD_DOCUMENT_ID);
|
var docId = rs.getLong(FIELD_DOCUMENT_ID);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
async function setKey(ev){
|
async function setKey(ev){
|
||||||
if (ev) ev.preventDefault();
|
if (ev) ev.preventDefault();
|
||||||
key = input;
|
key = input;
|
||||||
|
doSearch(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
@@ -130,6 +130,7 @@
|
|||||||
<title>Umbrella – {t('search')}: {key}</title>
|
<title>Umbrella – {t('search')}: {key}</title>
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
|
|
||||||
<fieldset class="search">
|
<fieldset class="search">
|
||||||
<legend>{t('search')}</legend>
|
<legend>{t('search')}</legend>
|
||||||
{#if error}
|
{#if error}
|
||||||
|
|||||||
@@ -170,8 +170,11 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|||||||
try {
|
try {
|
||||||
var projects = new HashMap<Long,Project>();
|
var projects = new HashMap<Long,Project>();
|
||||||
var query = select(ALL).from(TABLE_PROJECTS).leftJoin(ID,TABLE_PROJECT_USERS,PROJECT_ID).where(USER_ID, equal(userId));
|
var query = select(ALL).from(TABLE_PROJECTS).leftJoin(ID,TABLE_PROJECT_USERS,PROJECT_ID).where(USER_ID, equal(userId));
|
||||||
for (var key : keys) query.where(NAME,like("%"+key+"%"));
|
if (fulltext) {
|
||||||
LOG.log(WARNING,"Full-text search not implemented for projects");
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1})",NAME,DESCRIPTION),like("%"+key+"%"));
|
||||||
|
} else {
|
||||||
|
for (var key : keys) query.where(NAME,like("%"+key+"%"));
|
||||||
|
}
|
||||||
var rs = query.exec(db);
|
var rs = query.exec(db);
|
||||||
while (rs.next()){
|
while (rs.next()){
|
||||||
var project = Project.of(rs);
|
var project = Project.of(rs);
|
||||||
|
|||||||
@@ -120,9 +120,11 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|||||||
var tasks = new HashMap<Long,Task>();
|
var tasks = new HashMap<Long,Task>();
|
||||||
var query = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID)
|
var query = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID)
|
||||||
.where(USER_ID,equal(userId));
|
.where(USER_ID,equal(userId));
|
||||||
for (var key : keys) query.where(NAME,like("%"+key+"%"));
|
if (fulltext) {
|
||||||
LOG.log(WARNING,"Full-text search not implemented for tasks");
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1})",NAME,DESCRIPTION),like("%"+key+"%"));
|
||||||
|
} else {
|
||||||
|
for (var key : keys) query.where(NAME,like("%"+key+"%"));
|
||||||
|
}
|
||||||
var rs = query.exec(db);
|
var rs = query.exec(db);
|
||||||
while (rs.next()){
|
while (rs.next()){
|
||||||
var task = Task.of(rs);
|
var task = Task.of(rs);
|
||||||
|
|||||||
@@ -93,7 +93,11 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|||||||
public Map<Long, Time> find(long userId, List<String> keys, boolean fulltext) {
|
public Map<Long, Time> find(long userId, List<String> keys, boolean fulltext) {
|
||||||
try {
|
try {
|
||||||
var query = select(ALL).from(TABLE_TIMES).where(USER_ID,equal(userId));
|
var query = select(ALL).from(TABLE_TIMES).where(USER_ID,equal(userId));
|
||||||
for (var key : keys) query.where(format("CONCAT({0},\" \",{1})",SUBJECT,DESCRIPTION),like("%"+key+"%"));
|
if (fulltext) {
|
||||||
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1})",SUBJECT,DESCRIPTION),like("%"+key+"%"));
|
||||||
|
} else {
|
||||||
|
for (var key : keys) query.where(SUBJECT,like("%"+key+"%"));
|
||||||
|
}
|
||||||
var rs = query.exec(db);
|
var rs = query.exec(db);
|
||||||
var times = new HashMap<Long,Time>();
|
var times = new HashMap<Long,Time>();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
@@ -103,7 +107,6 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|||||||
rs.close();
|
rs.close();
|
||||||
return times;
|
return times;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
throw new UmbrellaException("Failed to search for times");
|
throw new UmbrellaException("Failed to search for times");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user