diff --git a/nitrite/src/main/java/org/dizitart/no2/filters/StringFilter.java b/nitrite/src/main/java/org/dizitart/no2/filters/StringFilter.java index dde668d74..f9740b4eb 100644 --- a/nitrite/src/main/java/org/dizitart/no2/filters/StringFilter.java +++ b/nitrite/src/main/java/org/dizitart/no2/filters/StringFilter.java @@ -23,6 +23,8 @@ * @since 1.0 */ public abstract class StringFilter extends ComparableFilter { + private final StringFilterHelper helper = new StringFilterHelper(); + /** * Instantiates a new String filter. * @@ -41,4 +43,15 @@ protected StringFilter(String field, String value) { public String getStringValue() { return (String) getValue(); } + + /** + * Converts an object to a string safely. + * @param obj the object to convert + * @return the string representation, or empty if null + */ + protected String toStringValue(Object obj) { + return helper.toStringValue(obj); + } + + public abstract boolean applyOnString(String value); } diff --git a/nitrite/src/main/java/org/dizitart/no2/filters/StringFilterHelper.java b/nitrite/src/main/java/org/dizitart/no2/filters/StringFilterHelper.java new file mode 100644 index 000000000..7ab4619e7 --- /dev/null +++ b/nitrite/src/main/java/org/dizitart/no2/filters/StringFilterHelper.java @@ -0,0 +1,7 @@ +package org.dizitart.no2.filters; + +public class StringFilterHelper { + public String toStringValue(Object obj) { + return obj != null ? obj.toString() : ""; + } +} diff --git a/nitrite/src/main/java/org/dizitart/no2/filters/TextFilter.java b/nitrite/src/main/java/org/dizitart/no2/filters/TextFilter.java index e1187501c..3d3d6efa7 100644 --- a/nitrite/src/main/java/org/dizitart/no2/filters/TextFilter.java +++ b/nitrite/src/main/java/org/dizitart/no2/filters/TextFilter.java @@ -48,11 +48,26 @@ public class TextFilter extends StringFilter { super(field, value); } + @Override + public boolean applyOnString(String value) { + String searchString = (String) this.getValue(); + if (searchString.startsWith("*") || searchString.endsWith("*")) { + searchString = searchString.replace("*", ""); + } + return value.toLowerCase().contains(searchString.toLowerCase()); + } + + /** + * Applies this filter to a document, checking if the specified field contains the search string. + * + * @param element the document pair to filter + * @return true if the field value contains the search string (case-insensitive), false otherwise + * @throws FilterException if the field is not a string + */ @Override public boolean apply(Pair element) { notNull(getField(), "field cannot be null"); notNull(getStringValue(), "search term cannot be null"); - String searchString = getStringValue(); Object docValue = element.getSecond().get(getField()); if (!(docValue instanceof String)) { @@ -60,12 +75,7 @@ public boolean apply(Pair element) { } String docString = (String) docValue; - - if (searchString.startsWith("*") || searchString.endsWith("*")) { - searchString = searchString.replace("*", ""); - } - - return docString.toLowerCase().contains(searchString.toLowerCase()); + return applyOnString(docString); } @Override @@ -194,4 +204,5 @@ private LinkedHashSet sortedIdsByScore(Map unsort public List applyOnIndex(IndexMap indexMap) { return null; } + } diff --git a/nitrite/src/main/java/org/dizitart/no2/migration/MigrationManager.java b/nitrite/src/main/java/org/dizitart/no2/migration/MigrationManager.java index 73823df7c..45d5362c0 100644 --- a/nitrite/src/main/java/org/dizitart/no2/migration/MigrationManager.java +++ b/nitrite/src/main/java/org/dizitart/no2/migration/MigrationManager.java @@ -48,29 +48,37 @@ public MigrationManager(Nitrite nitrite) { */ public void doMigrate() { if (isMigrationNeeded()) { - Integer existingVersion = storeMetadata.getSchemaVersion(); - Integer incomingVersion = nitriteConfig.getSchemaVersion(); - - Queue migrationPath = findMigrationPath(existingVersion, incomingVersion); - if (migrationPath == null || migrationPath.isEmpty()) { - // close the database - try { - database.close(); - } catch (Exception e) { - throw new NitriteIOException("Failed to close the database", e); - } + Integer currentVersion = storeMetadata.getSchemaVersion(); + Integer targetVersion = nitriteConfig.getSchemaVersion(); + + Queue migrationPath = findMigrationPath(currentVersion, targetVersion); + boolean hasValidPath = migrationPath != null && !migrationPath.isEmpty(); - throw new MigrationException("Schema version mismatch, no migration path found from version " - + storeMetadata.getSchemaVersion() + " to " + nitriteConfig.getSchemaVersion()); + if (!hasValidPath) { + closeDatabaseAndThrowException( currentVersion, targetVersion); } + executeMigrationPath(migrationPath); + } + } - int length = migrationPath.size(); - for (int i = 0; i < length; i++) { - Migration migration = migrationPath.poll(); - if (migration != null) { - Queue migrationSteps = migration.steps(); - executeMigrationSteps(migrationSteps); - } + private void closeDatabaseAndThrowException(Integer currentVersion, Integer targetVersion) { + // close the database + try { + database.close(); + } catch (Exception e) { + throw new NitriteIOException("Failed to close the database", e); + } + throw new MigrationException("Schema version mismatch, no migration path found from version " + + currentVersion + " to " + targetVersion); + } + + private void executeMigrationPath(Queue migrationPath) { + int pathLength = migrationPath.size(); + for (int i = 0; i < pathLength; i++) { + Migration migration = migrationPath.poll(); + if (migration != null) { + Queue migrationSteps = migration.steps(); + executeMigrationSteps(migrationSteps); } } }