001package gudusoft.gsqlparser.dlineage.graph.utils;
002
003import java.io.IOException;
004import java.io.Writer;
005import java.util.HashMap;
006import java.util.HashSet;
007import java.util.Map;
008import java.util.Set;
009
010public class LookupTranslator extends StringTranslator {
011
012    private final Map<String, String> lookupMap = new HashMap<>();
013    private final Set<Character> prefixSet = new HashSet<>();
014    private final int minLength;
015    private final int maxLength;
016
017    public LookupTranslator(CharSequence[]... lookupPairs) {
018        int min = Integer.MAX_VALUE;
019        int max = 0;
020
021        if (lookupPairs != null) {
022            for (CharSequence[] pair : lookupPairs) {
023                if (pair.length != 2) {
024                    throw new IllegalArgumentException("每个查找对必须长度为2");
025                }
026                String key = pair[0].toString();
027                String value = pair[1].toString();
028
029                lookupMap.put(key, value);
030                prefixSet.add(key.charAt(0));
031
032                int keyLen = key.length();
033                if (keyLen < min) min = keyLen;
034                if (keyLen > max) max = keyLen;
035            }
036        }
037
038        this.minLength = min;
039        this.maxLength = max;
040    }
041
042    @Override
043    public int translate(CharSequence input, int index, Writer out) throws IOException {
044        char currentChar = input.charAt(index);
045        if (!prefixSet.contains(currentChar)) return 0;
046
047        int maxCheckLen = Math.min(maxLength, input.length() - index);
048
049        for (int checkLen = maxCheckLen; checkLen >= minLength; checkLen--) {
050            String subSeq = input.subSequence(index, index + checkLen).toString();
051            String replacement = lookupMap.get(subSeq);
052            if (replacement != null) {
053                out.write(replacement);
054                return checkLen;
055            }
056        }
057
058        return 0;
059    }
060}