@Override public Parser<String, Object> makeParser() { // JavaScript configuration should be checked when it's actually used because someone might still want Druid // nodes to be able to deserialize JavaScript-based objects even though JavaScript is disabled. Preconditions.checkState(config.isEnabled(), "JavaScript is disabled"); parser = parser == null ? new JavaScriptParser(function) : parser; return parser; }
private JavaScriptDimFilter newJavaScriptDimFilter( final String dimension, final String function, final ExtractionFn extractionFn ) { return new JavaScriptDimFilter( dimension, function, extractionFn, JavaScriptConfig.getEnabledInstance() ); } }
@Test public void testGetRequiredColumns() { JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter("dim", FN1, null, new JavaScriptConfig(false)); Assert.assertEquals(javaScriptDimFilter.getRequiredColumns(), Sets.newHashSet("dim")); } }
@JsonCreator public JavaScriptTieredBrokerSelectorStrategy( @JsonProperty("function") String fn, @JacksonInject JavaScriptConfig config ) { Preconditions.checkNotNull(fn, "function must not be null"); Preconditions.checkState(config.isEnabled(), "JavaScript is disabled"); this.function = fn; }
@Test public void testEquals() { JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter("dim", FN1, null, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter2 = new JavaScriptDimFilter("di", FN2, null, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter3 = new JavaScriptDimFilter("di", FN2, null, JavaScriptConfig.getEnabledInstance()); Assert.assertNotEquals(javaScriptDimFilter, javaScriptDimFilter2); Assert.assertEquals(javaScriptDimFilter2, javaScriptDimFilter3); RegexDimExtractionFn regexFn = new RegexDimExtractionFn(".*", false, null); JavaScriptDimFilter javaScriptDimFilter4 = new JavaScriptDimFilter("dim", FN1, regexFn, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter5 = new JavaScriptDimFilter("dim", FN1, regexFn, JavaScriptConfig.getEnabledInstance()); Assert.assertNotEquals(javaScriptDimFilter, javaScriptDimFilter3); Assert.assertEquals(javaScriptDimFilter4, javaScriptDimFilter5); }
@Test public void testToFilterNotAllowed() { JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter("dim", FN1, null, new JavaScriptConfig(false)); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("JavaScript is disabled"); javaScriptDimFilter.toFilter(); Assert.assertTrue(false); }
@JsonCreator public JavaScriptWorkerSelectStrategy( @JsonProperty("function") String fn, @JacksonInject JavaScriptConfig config ) { Preconditions.checkNotNull(fn, "function must not be null"); Preconditions.checkState(config.isEnabled(), "JavaScript is disabled"); this.function = fn; }
@Test public void testToFilter() { JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter( "dim", "function(x) { return true; }", null, JavaScriptConfig.getEnabledInstance() ); final Filter filter = javaScriptDimFilter.toFilter(); Assert.assertThat(filter, CoreMatchers.instanceOf(JavaScriptFilter.class)); }
@Test public void testJavascriptNotAllowed() { String function = "function(str) { return str.substring(0,3); }"; ExtractionFn extractionFn = new JavaScriptExtractionFn(function, false, new JavaScriptConfig(false)); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("JavaScript is disabled"); extractionFn.apply("hey"); Assert.assertTrue(false); }
@Test public void testSerde() throws Exception { String json = "{\"enabled\":true}"; JavaScriptConfig config = mapper.readValue( mapper.writeValueAsString( mapper.readValue( json, JavaScriptConfig.class ) ), JavaScriptConfig.class ); Assert.assertTrue(config.isEnabled()); }
@Test public void testInjective() { Assert.assertEquals(ExtractionFn.ExtractionType.MANY_TO_ONE, new JavaScriptExtractionFn("function(str) { return str; }", false, JavaScriptConfig.getEnabledInstance()).getExtractionType()); Assert.assertEquals(ExtractionFn.ExtractionType.ONE_TO_ONE, new JavaScriptExtractionFn("function(str) { return str; }", true, JavaScriptConfig.getEnabledInstance()).getExtractionType()); } }
@Test public void testSerdeWithDefaults() throws Exception { String json = "{}"; JavaScriptConfig config = mapper.readValue( mapper.writeValueAsString( mapper.readValue( json, JavaScriptConfig.class ) ), JavaScriptConfig.class ); Assert.assertFalse(config.isEnabled()); } }
@Test public void testGetCacheKey() { JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter("dim", FN1, null, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter2 = new JavaScriptDimFilter("di", FN2, null, JavaScriptConfig.getEnabledInstance()); Assert.assertFalse(Arrays.equals(javaScriptDimFilter.getCacheKey(), javaScriptDimFilter2.getCacheKey())); RegexDimExtractionFn regexFn = new RegexDimExtractionFn(".*", false, null); JavaScriptDimFilter javaScriptDimFilter3 = new JavaScriptDimFilter("dim", FN1, regexFn, JavaScriptConfig.getEnabledInstance()); Assert.assertFalse(Arrays.equals(javaScriptDimFilter.getCacheKey(), javaScriptDimFilter3.getCacheKey())); }
@Test public void testInjectionEnabled() { final Properties props = new Properties(); props.setProperty("druid.javascript.enabled", "true"); JavaScriptConfig config = makeInjectorWithProperties(props).getInstance(JavaScriptConfig.class); Assert.assertTrue(config.isEnabled()); }
@Test public void testJavascriptSubstring() { String function = "function(str) { return str.substring(0,3); }"; ExtractionFn extractionFn = new JavaScriptExtractionFn(function, false, JavaScriptConfig.getEnabledInstance()); for (String str : testStrings) { String res = extractionFn.apply(str); Assert.assertEquals(str.substring(0, 3), res); } }
@Test public void testInjectionDefault() { JavaScriptConfig config = makeInjectorWithProperties(new Properties()).getInstance(JavaScriptConfig.class); Assert.assertFalse(config.isEnabled()); }
@Test public void testLongs() { String typeOf = "function(x) {\nreturn typeof x\n}"; Assert.assertEquals("number", new JavaScriptExtractionFn(typeOf, false, JavaScriptConfig.getEnabledInstance()).apply(1234L)); }
@Test public void testFloats() { String typeOf = "function(x) {\nreturn typeof x\n}"; Assert.assertEquals("number", new JavaScriptExtractionFn(typeOf, false, JavaScriptConfig.getEnabledInstance()).apply(1234.0)); }
@Test public void testTimeExample() { String utcHour = "function(t) {\nreturn 'Second ' + Math.floor((t % 60000) / 1000);\n}"; final long millis = DateTimes.of("2015-01-02T13:00:59.999Z").getMillis(); Assert.assertEquals("Second 59", new JavaScriptExtractionFn(utcHour, false, JavaScriptConfig.getEnabledInstance()).apply(millis)); }
@Test public void testHashcode() { JavaScriptDimFilter javaScriptDimFilter = new JavaScriptDimFilter("dim", FN1, null, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter2 = new JavaScriptDimFilter("di", FN2, null, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter3 = new JavaScriptDimFilter("di", FN2, null, JavaScriptConfig.getEnabledInstance()); Assert.assertNotEquals(javaScriptDimFilter.hashCode(), javaScriptDimFilter2.hashCode()); Assert.assertEquals(javaScriptDimFilter2.hashCode(), javaScriptDimFilter3.hashCode()); RegexDimExtractionFn regexFn = new RegexDimExtractionFn(".*", false, null); JavaScriptDimFilter javaScriptDimFilter4 = new JavaScriptDimFilter("dim", FN1, regexFn, JavaScriptConfig.getEnabledInstance()); JavaScriptDimFilter javaScriptDimFilter5 = new JavaScriptDimFilter("dim", FN1, regexFn, JavaScriptConfig.getEnabledInstance()); Assert.assertNotEquals(javaScriptDimFilter.hashCode(), javaScriptDimFilter3.hashCode()); Assert.assertEquals(javaScriptDimFilter4.hashCode(), javaScriptDimFilter5.hashCode()); }