@RequestMapping(value = "/range/{startTime}/{endTime}", method = RequestMethod.GET)
  @ResponseBody
  public JsonNode[] getInstants(
      @PathVariable long startTime,
      @PathVariable long endTime,
      @RequestParam(required = false) String resolution,
      @RequestParam(required = false) String timezone) {

    TimeInstant startTimeInstant =
        TimeInstant.fromValueObject(new TimeInstantVO(startTime, resolution, timezone));
    TimeInstant endTimeInstant =
        TimeInstant.fromValueObject(new TimeInstantVO(endTime, resolution, timezone));

    List<Node> nodes;
    try (Transaction tx = database.beginTx()) {
      nodes = timeTree.getOrCreateInstants(startTimeInstant, endTimeInstant);
      tx.success();
    }

    JsonNode[] result;
    try (Transaction tx = database.beginTx()) {
      result = jsonNodes(nodes);
      tx.success();
    }

    return result;
  }
  @RequestMapping(value = "/single/{time}", method = RequestMethod.GET)
  @ResponseBody
  public JsonNode getInstant(
      @PathVariable long time,
      @RequestParam(required = false) String resolution,
      @RequestParam(required = false) String timezone) {

    TimeInstant timeInstant =
        TimeInstant.fromValueObject(new TimeInstantVO(time, resolution, timezone));

    long id;

    try (Transaction tx = database.beginTx()) {
      id = timeTree.getOrCreateInstant(timeInstant).getId();
      tx.success();
    }

    JsonNode result;

    try (Transaction tx = database.beginTx()) {
      result = new JsonNode(database.getNodeById(id));
      tx.success();
    }

    return result;
  }