You've already forked Arcturus-Morningstar-Extended
mirror of
https://github.com/duckietm/Arcturus-Morningstar-Extended.git
synced 2026-06-19 15:06:19 +00:00
feat(furnieditor): search also matches furnidata display names
This commit is contained in:
@@ -167,5 +167,26 @@ public class FurnitureTextProvider {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all lowercased base classnames whose furnidata display name contains
|
||||
* {@code query} (case-insensitive, substring). Results are capped at 200 to
|
||||
* bound SQL IN-clause size. Returns an empty list when query is null/blank.
|
||||
*/
|
||||
public java.util.List<String> findClassnamesByName(String query) {
|
||||
java.util.List<String> out = new java.util.ArrayList<>();
|
||||
if (query == null) return out;
|
||||
String q = query.trim().toLowerCase(Locale.ROOT);
|
||||
if (q.isEmpty()) return out;
|
||||
Map<String, FurniText> idx = this.index; // local ref (volatile)
|
||||
for (Map.Entry<String, FurniText> e : idx.entrySet()) {
|
||||
FurniText t = e.getValue();
|
||||
if (t != null && t.name() != null && t.name().toLowerCase(Locale.ROOT).contains(q)) {
|
||||
out.add(e.getKey()); // key is the lowercased base classname
|
||||
if (out.size() >= 200) break; // bound IN-clause size
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
private record FurniText(int id, FurnitureType type, String name, String description) {}
|
||||
}
|
||||
|
||||
+28
@@ -64,6 +64,34 @@ public class FurniEditorSearchEvent extends MessageHandler {
|
||||
params.add(type);
|
||||
}
|
||||
|
||||
// Extend search with furnidata display-name matches (server-authoritative names in JSON).
|
||||
// Appends: OR (LOWER(item_name) IN (?,?,...) [AND type=?])
|
||||
// Both branches carry their own type filter, so type scoping is preserved.
|
||||
// Params: [existing LIKE params] [existing type?] [furniCns...] [type again?]
|
||||
if (!query.isEmpty()) {
|
||||
java.util.List<String> furniCns = Emulator.getGameEnvironment()
|
||||
.getFurnitureTextProvider()
|
||||
.findClassnamesByName(query);
|
||||
if (!furniCns.isEmpty()) {
|
||||
// Build: OR (LOWER(item_name) IN (?,?,...) [AND type = ?])
|
||||
StringBuilder orBranch = new StringBuilder(" OR (LOWER(item_name) IN (");
|
||||
for (int i = 0; i < furniCns.size(); i++) {
|
||||
if (i > 0) orBranch.append(", ");
|
||||
orBranch.append('?');
|
||||
}
|
||||
orBranch.append(')');
|
||||
if (type != null && !type.isEmpty()) {
|
||||
orBranch.append(" AND type = ?");
|
||||
}
|
||||
orBranch.append(')');
|
||||
whereClause.append(orBranch);
|
||||
params.addAll(furniCns);
|
||||
if (type != null && !type.isEmpty()) {
|
||||
params.add(type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Count total
|
||||
int total = 0;
|
||||
String countSql = "SELECT COUNT(*) FROM items_base " + whereClause;
|
||||
|
||||
Reference in New Issue
Block a user