/** * Build a DimensionValueLoadTask. * * @param webService The web service used by the loader to query dimension values * @param physicalTableDictionary The table to update dimensions on * @param dimensionDictionary The dimensions to update * * @return A DimensionValueLoadTask */ protected DimensionValueLoadTask buildDruidDimensionsLoader( DruidWebService webService, PhysicalTableDictionary physicalTableDictionary, DimensionDictionary dimensionDictionary ) { DruidDimensionValueLoader druidDimensionRowProvider = new DruidDimensionValueLoader( physicalTableDictionary, dimensionDictionary, webService ); return new DimensionValueLoadTask(Collections.singletonList(druidDimensionRowProvider)); }
/** * Build the callback to handle the successful druid query response. * * @param dimension Dimension for which we are getting values * * @return the callback */ private SuccessCallback buildDruidDimensionsSuccessCallback(Dimension dimension) { return rootNode -> { rootNode.forEach(intervalNode -> { intervalNode.get("result").forEach(dim -> { String value = dim.get("value").asText(); if (dimension.findDimensionRowByKeyValue(value) == null) { DimensionRow dimRow = dimension.createEmptyDimensionRow(value); updateDimensionWithValue(dimension, dimRow); } }); }); updateDimension(dimension); }; } }
@Override public void query(Dimension dimension, DataSource dataSource) { // Success callback will update the dimension cache SuccessCallback success = buildDruidDimensionsSuccessCallback(dimension); DruidSearchQuery druidSearchQuery = new DruidSearchQuery( dataSource, AllGranularity.INSTANCE, null, Collections.singletonList(INTERVAL), Collections.singletonList(dimension), SEARCH_QUERY_SPEC, null, ROW_LIMIT ); RequestContext requestContext = new RequestContext(null, false); druidWebService.postDruidQuery( requestContext, success, errorCallback, failureCallback, druidSearchQuery ); }