/**
   * Difference from getInternalCSV: Joins with CHARGE_BOX and OCPP_TAG tables, selects
   * CHARGE_BOX_PK and OCPP_TAG_PK additionally
   */
  @SuppressWarnings("unchecked")
  private SelectQuery<
          Record10<
              Integer,
              String,
              Integer,
              String,
              DateTime,
              String,
              DateTime,
              String,
              Integer,
              Integer>>
      getInternal(TransactionQueryForm form) {

    SelectQuery selectQuery = ctx.selectQuery();
    selectQuery.addFrom(TRANSACTION);
    selectQuery.addJoin(CONNECTOR, TRANSACTION.CONNECTOR_PK.eq(CONNECTOR.CONNECTOR_PK));
    selectQuery.addJoin(CHARGE_BOX, CHARGE_BOX.CHARGE_BOX_ID.eq(CONNECTOR.CHARGE_BOX_ID));
    selectQuery.addJoin(OCPP_TAG, OCPP_TAG.ID_TAG.eq(TRANSACTION.ID_TAG));
    selectQuery.addSelect(
        TRANSACTION.TRANSACTION_PK,
        CONNECTOR.CHARGE_BOX_ID,
        CONNECTOR.CONNECTOR_ID,
        TRANSACTION.ID_TAG,
        TRANSACTION.START_TIMESTAMP,
        TRANSACTION.START_VALUE,
        TRANSACTION.STOP_TIMESTAMP,
        TRANSACTION.STOP_VALUE,
        CHARGE_BOX.CHARGE_BOX_PK,
        OCPP_TAG.OCPP_TAG_PK);

    return addConditions(selectQuery, form);
  }
  @SuppressWarnings("unchecked")
  private Result<Record5<Integer, String, String, String, DateTime>> getOverviewInternal(
      ChargePointQueryForm form) {
    SelectQuery selectQuery = ctx.selectQuery();
    selectQuery.addFrom(CHARGE_BOX);
    selectQuery.addSelect(
        CHARGE_BOX.CHARGE_BOX_PK,
        CHARGE_BOX.CHARGE_BOX_ID,
        CHARGE_BOX.DESCRIPTION,
        CHARGE_BOX.OCPP_PROTOCOL,
        CHARGE_BOX.LAST_HEARTBEAT_TIMESTAMP);

    if (form.isSetOcppVersion()) {

      // http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html
      selectQuery.addConditions(
          CHARGE_BOX.OCPP_PROTOCOL.like(form.getOcppVersion().getValue() + "_"));
    }

    if (form.isSetDescription()) {
      selectQuery.addConditions(includes(CHARGE_BOX.DESCRIPTION, form.getDescription()));
    }

    switch (form.getHeartbeatPeriod()) {
      case ALL:
        break;

      case TODAY:
        selectQuery.addConditions(
            date(CHARGE_BOX.LAST_HEARTBEAT_TIMESTAMP).eq(date(DateTime.now())));
        break;

      case YESTERDAY:
        selectQuery.addConditions(
            date(CHARGE_BOX.LAST_HEARTBEAT_TIMESTAMP).eq(date(DateTime.now().minusDays(1))));
        break;

      case EARLIER:
        selectQuery.addConditions(
            date(CHARGE_BOX.LAST_HEARTBEAT_TIMESTAMP).lessThan(date(DateTime.now().minusDays(1))));
        break;

      default:
        throw new SteveException("Unknown enum type");
    }

    // Default order
    selectQuery.addOrderBy(CHARGE_BOX.CHARGE_BOX_PK.asc());

    return selectQuery.fetch();
  }