mirror of
https://github.com/gnosygnu/xowa.git
synced 2025-06-02 07:24:19 +00:00
Full-text search: Clear cache if more than 8 entries
This commit is contained in:
parent
c3eca52574
commit
879ef3a7d0
53
400_xowa/src/gplx/core/lists/Queue_adp.java
Normal file
53
400_xowa/src/gplx/core/lists/Queue_adp.java
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.lists; import gplx.*; import gplx.core.*;
|
||||
public class Queue_adp {
|
||||
private int count;
|
||||
private Queue_itm head;
|
||||
private Queue_itm tail;
|
||||
public int Count() {return count;}
|
||||
public boolean Is_empty() {return count == 0;}
|
||||
public void Enqueue(Object data) {
|
||||
Queue_itm item = new Queue_itm(data);
|
||||
if (head == null) {
|
||||
head = item;
|
||||
}
|
||||
if (tail != null) {
|
||||
tail.next = item;
|
||||
}
|
||||
tail = item;
|
||||
count++;
|
||||
}
|
||||
public Object Dequeue() {
|
||||
Object rv = Peek();
|
||||
head = head.next;
|
||||
count--;
|
||||
return rv;
|
||||
}
|
||||
public Object Peek() {
|
||||
if (head == null) throw Err_.new_wo_type("queue is empty");
|
||||
Queue_itm rv = head;
|
||||
return rv.Data();
|
||||
}
|
||||
}
|
||||
class Queue_itm {
|
||||
private final Object data;
|
||||
public Queue_itm next;
|
||||
public Queue_itm(Object data) {
|
||||
this.data = data;
|
||||
}
|
||||
public Object Data() {return data;}
|
||||
}
|
59
400_xowa/src/gplx/core/lists/Queue_adp_tst.java
Normal file
59
400_xowa/src/gplx/core/lists/Queue_adp_tst.java
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.lists; import gplx.*; import gplx.core.*;
|
||||
import org.junit.*; import gplx.core.tests.*;
|
||||
public class Queue_adp_tst {
|
||||
private final Queue_adp_fxt fxt = new Queue_adp_fxt();
|
||||
@Test public void Empty() {
|
||||
boolean pass = true;
|
||||
try {
|
||||
fxt.Test__dequeue(null, -1);
|
||||
pass = false;
|
||||
} catch (Exception e) {
|
||||
Err_.Noop(e);
|
||||
return;
|
||||
}
|
||||
if (pass) throw Err_.new_wo_type("empty should have failed");
|
||||
}
|
||||
@Test public void Add_1() {
|
||||
fxt.Exec__enqueue("a");
|
||||
fxt.Test__dequeue("a", 0);
|
||||
}
|
||||
@Test public void Add_n() {
|
||||
fxt.Exec__enqueue("a");
|
||||
fxt.Exec__enqueue("b");
|
||||
fxt.Exec__enqueue("c");
|
||||
fxt.Test__dequeue("a", 2);
|
||||
fxt.Test__dequeue("b", 1);
|
||||
fxt.Test__dequeue("c", 0);
|
||||
}
|
||||
@Test public void Mix() {
|
||||
fxt.Exec__enqueue("a");
|
||||
fxt.Exec__enqueue("b");
|
||||
fxt.Test__dequeue("a", 1);
|
||||
fxt.Exec__enqueue("c");
|
||||
fxt.Test__dequeue("b", 1);
|
||||
fxt.Test__dequeue("c", 0);
|
||||
}
|
||||
}
|
||||
class Queue_adp_fxt {
|
||||
private final Queue_adp queue = new Queue_adp();
|
||||
public void Exec__enqueue(String s) {queue.Enqueue(s);}
|
||||
public void Test__dequeue(String expd_data, int expd_len) {
|
||||
Gftest.Eq__str(expd_data, (String)queue.Dequeue());
|
||||
Gftest.Eq__int(expd_len , queue.Count());
|
||||
}
|
||||
}
|
@ -61,10 +61,10 @@ class StatRng {
|
||||
public long Sum = 0;
|
||||
public int Count = 0;
|
||||
public float Avg() {return Sum / Count;}
|
||||
public final StatItm[] Lo_ary;
|
||||
public final StatItm[] Lo_ary;
|
||||
public int Lo_ary_bound;
|
||||
public int Lo_ary_len;
|
||||
public final StatItm[] Hi_ary;
|
||||
public final StatItm[] Hi_ary;
|
||||
public int Hi_ary_bound;
|
||||
public int Hi_ary_len;
|
||||
public StatRng[] Slot_ary;
|
||||
|
@ -22,9 +22,11 @@ class Xofulltext_searcher_html extends Xow_special_wtr__base implements Mustache
|
||||
private final boolean case_match, auto_wildcard_bgn, auto_wildcard_end, expand_matches_section, show_all_matches;
|
||||
private final Hash_adp props = Hash_adp_.New();
|
||||
public Xofulltext_searcher_html(Xocfg_mgr cfg_mgr, Gfo_qarg_mgr url_args, Xow_wiki wiki, Guid_adp page_guid) {
|
||||
String search_text = url_args.Read_str_or("search", "");
|
||||
search_text = String_.Replace(search_text, "_", " "); // xofulltext_searcher.js chains multiple words with "_"; convert back to space
|
||||
props.Add("search", search_text);
|
||||
props.Add("page_guid", page_guid.To_str());
|
||||
props.Add("cur_wiki", wiki.Domain_str());
|
||||
props.Add("search", url_args.Read_str_or("search", ""));
|
||||
props_Add(cfg_mgr, url_args, "wikis" , wiki.Domain_str());
|
||||
props_Add(cfg_mgr, url_args, "ns_ids", "0");
|
||||
props_Add(cfg_mgr, url_args, "limits", "100");
|
||||
|
@ -29,7 +29,7 @@ import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.gflucenes.*;
|
||||
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.brutes.*;
|
||||
class Xofulltext_searcher_svc implements Gfo_invk {
|
||||
private final Xoa_app app;
|
||||
private final Hash_adp wkr_hash = Hash_adp_.New();
|
||||
private final Ordered_hash wkr_hash = Ordered_hash_.New();
|
||||
public Xofulltext_searcher_svc(Xoa_app app) {
|
||||
this.app = app;
|
||||
}
|
||||
@ -38,6 +38,31 @@ class Xofulltext_searcher_svc implements Gfo_invk {
|
||||
Xofulltext_args_qry prv_args = (Xofulltext_args_qry)wkr_hash.Get_by(page_guid);
|
||||
if (prv_args != null) {
|
||||
prv_args.Cancel();
|
||||
synchronized (wkr_hash) {
|
||||
wkr_hash.Del(page_guid);
|
||||
}
|
||||
}
|
||||
}
|
||||
private static void Compress(Ordered_hash wkr_hash) {
|
||||
int max = 2;
|
||||
int len = wkr_hash.Len();
|
||||
if (len > max) {
|
||||
synchronized (wkr_hash) {
|
||||
// create list for deleted items; in general, this list will never be more than 1
|
||||
List_adp deleted = List_adp_.New();
|
||||
|
||||
int bgn = len - max;
|
||||
for (int i = 0; i < bgn; i++) {
|
||||
Xofulltext_args_qry args = (Xofulltext_args_qry)wkr_hash.Get_at(i);
|
||||
deleted.Add(args);
|
||||
}
|
||||
|
||||
len = deleted.Len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xofulltext_args_qry args = (Xofulltext_args_qry)deleted.Get_at(i);
|
||||
wkr_hash.Del(args.page_guid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void Search(Json_nde args) {
|
||||
@ -47,7 +72,10 @@ class Xofulltext_searcher_svc implements Gfo_invk {
|
||||
|
||||
// cancel any existing searches
|
||||
this.Cancel(search_args.page_guid);
|
||||
wkr_hash.Add(search_args.page_guid, search_args);
|
||||
Compress(wkr_hash);
|
||||
synchronized (wkr_hash) {
|
||||
wkr_hash.Add(search_args.page_guid, search_args);
|
||||
}
|
||||
|
||||
// autosave any changes if enabled
|
||||
Xocfg_mgr cfg_mgr = app.Cfg();
|
||||
|
Loading…
Reference in New Issue
Block a user