public static ChainMap<String, Object> value(Object value){ return named(KEY_UNNAMED, value); }
private Rule parseDay(String s) { Rule r = null; if(s.equals("today")) r = new Rule("$DATE_OFFSET", s, SemanticUtils.named("offset", SemanticUtils.named("day", 0.0))); else if(s.equals("tomorrow")) r = new Rule("$DATE_OFFSET", s, SemanticUtils.named("offset", SemanticUtils.named("day", 1.0))); else if(mapDow.containsKey(s)) r = new Rule("$DATE_DOW", s, SemanticUtils.named("dow", mapDow.get(s))); return r; }
private Rule parseMonth(String s) { Rule r = null; if(mapMonths.containsKey(s.toLowerCase())) r = new Rule("$DATE_MONTH", s, SemanticUtils.named("month", mapMonths.get(s))); return r; }
private Rule parseTime(String s) { Rule rule = null; if(SHIFT_MAP.containsKey(s)){ rule = new Rule("$DATE_SHIFT", s, SemanticUtils.named("shift", SHIFT_MAP.get(s))); } return rule; }
private List<Rule> parseNumber(String s) { List<Rule> rules = new LinkedList<>(); Matcher m = PATTERN_NUMBER.matcher(s); if(m.matches()) { Integer num = Integer.valueOf(m.group(1)); if(num >= 1 && num <= 31) rules.add(new Rule("$DATE_DAY", s, SemanticUtils.named("day", num.doubleValue()))); if(num >= 1 && num <= 12) rules.add(new Rule("$DATE_MONTH", s, SemanticUtils.named("month", num.doubleValue()))); if((num >= 1 && num <= 99) || (num >= 1970 && num <= 2100)) rules.add(new Rule("$DATE_YEAR", s, SemanticUtils.named("year", num.doubleValue()))); if(num >= 100 && num <= 1259) { Integer min = num % 100; Integer hr = num / 100; final Map<String, Object> template = SemanticUtils.named("hour", hr.doubleValue()); if(min > 0) template.put("minute", min.doubleValue()); rules.add(new Rule("$DATE_TIME", s, template)); } } return rules; }
@Test void appendMulti(){ List<Map<String, Object>> params = Arrays.asList( named("x", Collections.singletonList(named("a", 1))), named("b",2), named(KEY_UNNAMED, 4), named("c",3) ); List<Object> expected = Arrays.asList( named("a", 1), named("b",2), named("c",3) ); assertEquals(expected, SemanticUtils.append(params, "x")); }
@Test void parseTemplateAppend(){ Map<String, Object> template = named("x", _APPEND); Map<String, Object> expected = named("x", Arrays.asList( named("a", 10), named("b",20), named("c",3) )); List<Map<String, Object>> params = Arrays.asList( value(1), named("x", Arrays.asList(named("a", 10), named("b", 20))), named("c",3) ); SemanticFunction fn = SemanticUtils.parseTemplate(template); assertEquals(Collections.singletonList(expected), fn.apply(params)); }
@Test void parseSemantics() { List<Map<String, Object>> params = Arrays.asList( named("a", 1), named("b",2), named("c", 3) ); List<Map<String, Object>> first = Collections.singletonList( named("a", 1) ); List<Map<String, Object>> mid = Collections.singletonList( named("b", 2) ); assertEquals(first, SemanticUtils.parseSemantics("@first").apply(params)); assertEquals(mid, SemanticUtils.parseSemantics("@1").apply(params)); }
@Test void merge(){ List<Map<String, Object>> params = Arrays.asList( named("a", 1), named("b",2), named("c", 3) ); List<Map<String, Object>> merged = Collections.singletonList( new HashMap<String, Object>() {{ put("a", 1); put("b", 2); put("c", 3); }} ); assertEquals(merged, SemanticUtils.merge(params)); }
@Test void parseTemplateMerge() { Map<String, Object> template = named("a", _FIRST) .named("@merge", Arrays.asList(1, 2)); Map<String, Object> expected = new HashMap<String, Object>(){{ put("a", 1); put("x", 10); put("y", 20); }}; List<Map<String, Object>> params = Arrays.asList( value(1), named("x", 10), named("y", 20) ); SemanticFunction fn = SemanticUtils.parseTemplate(template); assertEquals(Collections.singletonList(expected), fn.apply(params)); }
@Test void parseTemplate() { Map<String, Object> template = named("a", _FIRST).named("b", _N(1)) .named("c", named("d", _LAST)); Map<String, Object> expected = new HashMap<String, Object>(){{ put("a", 1); put("b", new HashMap<String, Object>() {{put("x", 10);}}); put("c", new HashMap<String, Object>() {{put("d", 3);}}); }}; List<Map<String, Object>> params = Arrays.asList( value(1), named("x", 10), value(3) ); SemanticFunction fn = SemanticUtils.parseTemplate(template); assertEquals(Collections.singletonList(expected), fn.apply(params)); }
@Test void parseSemanticsMerge() { Map<String, Object> expected = new HashMap<String, Object>(){{ put("a", 1); put("x", 10); put("y", 20); }}; List<Map<String, Object>> params = Arrays.asList( value(1), named("x", 10), named("y", 20) ); String json = "{a:@first, @merge:[1,2]}"; SemanticFunction fn = SemanticUtils.parseSemantics(json); assertEquals(Collections.singletonList(expected), fn.apply(params)); }
@Test void parseSemanticsJson() { List<Map<String, Object>> params = Arrays.asList( value(1), named("x", 10), value(3) ); List<Map<String, Object>> params2 = Arrays.asList( value("hello"), named("z", -1), value(30) ); Map<String, Object> expected = new HashMap<String, Object>(){{ put("a", 1); put("b", new HashMap<String, Object>() {{put("x", 10);}}); put("c", new HashMap<String, Object>() {{put("d", 3);}}); put("e", "hello"); }}; Map<String, Object> expected2 = new HashMap<String, Object>(){{ put("a", "hello"); put("b", new HashMap<String, Object>() {{put("z", -1);}}); put("c", new HashMap<String, Object>() {{put("d", 30);}}); put("e", "hello"); }}; String json = "{a:@first, b:@1, c:{d:@last}, e:hello}"; SemanticFunction fn = SemanticUtils.parseSemantics(json); assertEquals(Collections.singletonList(expected), fn.apply(params)); assertEquals(Collections.singletonList(expected2), fn.apply(params2)); }