package com.midea.cloudSearch.druid.segment; import java.util.ArrayList; import java.util.List; public class HintFactory { public static Hint getHintFromString(String hintAsString){ if(hintAsString.startsWith("! USE_NESTED_LOOPS") || hintAsString.startsWith("! USE_NL")){ return new Hint(HintType.USE_NESTED_LOOPS,null); } if(hintAsString.equals("! HASH_WITH_TERMS_FILTER")) return new Hint(HintType.HASH_WITH_TERMS_FILTER,null); if(hintAsString.startsWith("! JOIN_TABLES_LIMIT")){ String[] numbers = getParamsFromHint(hintAsString, "! JOIN_TABLES_LIMIT"); //todo: check if numbers etc.. List<Object> params = new ArrayList<>(); for (String number : numbers){ if(number.equals("null") || number.equals("infinity")){ params.add(null); } else { params.add(Integer.parseInt(number)); } } return new Hint(HintType.JOIN_LIMIT,params.toArray()); } if(hintAsString.startsWith("! NL_MULTISEARCH_SIZE")) { String[] number = getParamsFromHint(hintAsString,"! NL_MULTISEARCH_SIZE"); //todo: check if numbers etc.. int multiSearchSize = Integer.parseInt(number[0]); return new Hint(HintType.NL_MULTISEARCH_SIZE,new Object[]{multiSearchSize}); } if(hintAsString.startsWith("! USE_SCROLL")){ String[] scrollParams = getParamsFromHint(hintAsString,"! USE_SCROLL"); int docsPerShardFetch = 50; int timeout = 60000; if(scrollParams != null && scrollParams.length ==2) { docsPerShardFetch = Integer.parseInt(scrollParams[0]); timeout = Integer.parseInt(scrollParams[1]); } return new Hint(HintType.USE_SCROLL, new Object[]{docsPerShardFetch,timeout}); } if(hintAsString.startsWith("! IGNORE_UNAVAILABLE")){ return new Hint(HintType.IGNORE_UNAVAILABLE,null); } if(hintAsString.startsWith("! DOCS_WITH_AGGREGATION")) { String[] number = getParamsFromHint(hintAsString,"! DOCS_WITH_AGGREGATION"); //todo: check if numbers etc.. int docsWithAggregation = Integer.parseInt(number[0]); return new Hint(HintType.DOCS_WITH_AGGREGATION,new Object[]{docsWithAggregation}); } return null; } private static String[] getParamsFromHint(String hint, String prefix) { if(!hint.contains("(")) return null; String onlyParams = hint.replace(prefix, "").replaceAll("\\s*\\(\\s*","").replaceAll("\\s*\\,\\s*", ",").replaceAll("\\s*\\)\\s*", ""); return onlyParams.split(","); } }