[Schmitzm-commits] r2159 - trunk/schmitzm-core/src/main/java/de/schmitzm/regex

scm-commit at wald.intevation.org scm-commit at wald.intevation.org
Sat Dec 8 23:30:00 CET 2012


Author: alfonx
Date: 2012-12-08 23:30:00 +0100 (Sat, 08 Dec 2012)
New Revision: 2159

Modified:
   trunk/schmitzm-core/src/main/java/de/schmitzm/regex/RegexCache.java
Log:
RegexCache performance Optimierung.

Modified: trunk/schmitzm-core/src/main/java/de/schmitzm/regex/RegexCache.java
===================================================================
--- trunk/schmitzm-core/src/main/java/de/schmitzm/regex/RegexCache.java	2012-12-08 22:19:13 UTC (rev 2158)
+++ trunk/schmitzm-core/src/main/java/de/schmitzm/regex/RegexCache.java	2012-12-08 22:30:00 UTC (rev 2159)
@@ -9,7 +9,9 @@
 import org.apache.solr.util.ConcurrentLRUCache;
 import org.apache.solr.util.ConcurrentLRUCache.Stats;
 
+import com.eaio.stringsearch.BNDM;
 import com.eaio.stringsearch.BNDMCI;
+import com.eaio.stringsearch.StringSearch;
 
 /**
  * Cached compilierte Pattern und auch Ergebnisse von RegExes. Use the matchers methods to obtain cached result and add
@@ -132,14 +134,31 @@
 
 		final String value = object instanceof String ? (String) object : object.toString();
 
-		// Hier beginnt eine interessante Optimierung. Wenn der String keine Regex ist, und nicht länger 32, dann wird ein schnellere Stringsuche verwendet.
+		// Hier beginnt eine interessante Optimierung. Wenn der String keine Regex ist, und nicht länger 32, dann wird
+		// ein schnellere Stringsuche verwendet.
 		boolean canSpeedup = true;
+		boolean speedUpIgnorecase = true;
 
-		if (regex.length() > 32 || looksLikeRegex(regex))
+		if (regex.length() > 32)
 			canSpeedup = false;
+		else {
+			String copy = regex;
+			if (copy.startsWith("(?is)") || copy.startsWith("(?im)") || copy.startsWith("(?ims)")) {
+				copy = copy.substring(5);
+				speedUpIgnorecase = true;
+			}
+			if (copy.startsWith("^.*?")) {
+				copy = copy.substring(4);
+			}
+			canSpeedup = !(looksLikeRegex(copy));
+		}
 
 		if (canSpeedup) {
-			int idx = new BNDMCI().searchString(value, regex);
+
+			StringSearch bndm = speedUpIgnorecase ? new BNDMCI() : new BNDM();
+			int searchString = bndm.searchString(value, regex);
+
+			int idx = searchString;
 			return idx >= 0;
 		} else {
 			return result(regex, value) != null;



More information about the Schmitzm-commits mailing list