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();
 }