public MeasureFilterResult execute(Map<String, Object> filterMap, @Nullable Long userId) { StopWatch watch = profiling.start("measures", Level.BASIC); StopWatch sqlWatch = null; MeasureFilterResult result = new MeasureFilterResult(); MeasureFilterContext context = new MeasureFilterContext(); context.setUserId(userId); context.setData( String.format("{%s}", Joiner.on('|').withKeyValueSeparator("=").join(filterMap))); try { MeasureFilter filter = factory.create(filterMap); sqlWatch = profiling.start("sql", Level.FULL); List<MeasureFilterRow> rows = executor.execute(filter, context); result.setRows(rows); } catch (NumberFormatException e) { result.setError(MeasureFilterResult.Error.VALUE_SHOULD_BE_A_NUMBER); LOG.debug("Value selected for the metric should be a number: " + context); } catch (Exception e) { result.setError(MeasureFilterResult.Error.UNKNOWN); LOG.error("Fail to execute measure filter: " + context, e); } finally { if (sqlWatch != null) { sqlWatch.stop(context.getSql()); } watch.stop(log(context, result)); } return result; }
private String log(MeasureFilterContext context, MeasureFilterResult result) { StringBuilder log = new StringBuilder(); log.append(SystemUtils.LINE_SEPARATOR); log.append("request: ").append(context.getData()).append(SystemUtils.LINE_SEPARATOR); log.append(" result: ").append(result.toString()); return log.toString(); }