From 6551e8e85414d73eb62fad9d341ebf60ba01750a Mon Sep 17 00:00:00 2001 From: lion Date: Sun, 15 Jun 2025 16:04:14 +0800 Subject: [PATCH] field list range specified supported --- .../org/lionsoul/ip2region/MakerTest.java | 57 ++++++++++++++----- .../java/org/lionsoul/ip2region/UtilTest.java | 21 +++++++ 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/maker/java/src/main/java/org/lionsoul/ip2region/MakerTest.java b/maker/java/src/main/java/org/lionsoul/ip2region/MakerTest.java index d7b004a..86d2582 100644 --- a/maker/java/src/main/java/org/lionsoul/ip2region/MakerTest.java +++ b/maker/java/src/main/java/org/lionsoul/ip2region/MakerTest.java @@ -12,12 +12,16 @@ import org.lionsoul.ip2region.xdb.Log; import org.lionsoul.ip2region.xdb.Maker; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class MakerTest { public final static Log log = Log.getLogger(MakerTest.class); + public final static Pattern p = Pattern.compile("^(\\d+(-\\d+)?)$"); public static void printHelp(String[] args) { System.out.println("ip2region xdb maker"); @@ -25,7 +29,7 @@ public class MakerTest { System.out.println("options:"); System.out.println(" --src string source ip text file path"); System.out.println(" --dst string destination binary xdb file path"); - System.out.println(" --field-list string field index list imploded with ',' eg: 0,1,2,3,4"); + System.out.println(" --field-list string field index list imploded with ',' eg: 0,1,2,3-6,7"); System.out.println(" --log-level string set the log level, options: debug/info/warn/error"); } @@ -37,28 +41,53 @@ public class MakerTest { for (String f : fList) { final String s = f.trim(); if (s.isEmpty()) { - log.infof("undefined option `%s`", f); + log.errorf("undefined option `%s`", f); return null; } - if (!s.matches("^\\d+$")) { - log.infof("field `%s` is not a number", f); + final Matcher m = p.matcher(s); + if (!m.matches()) { + log.errorf("field `%s` is not a number", f); return null; } - if (map.containsKey(s)) { - log.infof("duplicate field index `%s`", s); + final String ms = m.group(1); + if (ms.indexOf('-') == -1) { + if (map.containsKey(s)) { + log.errorf("duplicate field index `%s`", s); + return null; + } + + map.put(s, s); + final int idx = Integer.parseInt(s); + if (idx < 0) { + log.errorf("field index `%s` is negative", s); + return null; + } + + list.add(idx); + continue; + } + + // index range parse + final String[] ra = ms.split("-"); + if (ra.length != 2) { + log.errorf("field `%s` is not a valid range", ms); return null; } - map.put(s, s); - final int idx = Integer.parseInt(s); - if (idx < 0) { - log.infof("field index `%s` is negative", s); - return null; - } + final int start = Integer.parseInt(ra[0]); + final int end = Integer.parseInt(ra[1]); + for (int i = start; i <= end; i++) { + final String _s = String.valueOf(i); + if (map.containsKey(_s)) { + log.errorf("duplicate field index `%s`", _s); + return null; + } - list.add(idx); + map.put(_s, _s); + list.add(i); + } } } @@ -68,6 +97,8 @@ public class MakerTest { fields[i] = list.get(i); } + // sort the fields to make sure the fields follow the original index order + Arrays.sort(fields); return fields; } diff --git a/maker/java/src/main/java/org/lionsoul/ip2region/UtilTest.java b/maker/java/src/main/java/org/lionsoul/ip2region/UtilTest.java index 8c57abf..2c5c5e8 100644 --- a/maker/java/src/main/java/org/lionsoul/ip2region/UtilTest.java +++ b/maker/java/src/main/java/org/lionsoul/ip2region/UtilTest.java @@ -12,6 +12,8 @@ import org.lionsoul.ip2region.xdb.Log; import org.lionsoul.ip2region.xdb.Segment; import org.lionsoul.ip2region.xdb.Util; +import java.util.regex.Matcher; + public class UtilTest { public static final Log log = Log.getLogger(UtilTest.class); @@ -67,6 +69,21 @@ public class UtilTest { } } + public static void testIndexParse() { + final String[] ss = new String[]{"1", "2-3", "23", "3-", "x-", "3-x", "4x"}; + for (String s : ss) { + log.infof("parse: %s", s); + final Matcher m = MakerTest.p.matcher(s); + if (m.matches()) { + for (int i = 0; i < m.groupCount(); i++) { + log.infof("match: %d/%d, str: %s", i, m.groupCount(), m.group(i)); + } + } else { + log.infof("no match for: %s", s); + } + } + } + public static void main(String[] args) { System.out.println("+-- testing index policy"); testIndexPolicy(); @@ -83,6 +100,10 @@ public class UtilTest { System.out.println("+-- testing field filter"); testFieldFilter(); System.out.println(); + + System.out.println("+-- testing index parse"); + testIndexParse(); + System.out.println(); } }