public void updateDailyExchangeRateTable(
      CurrencyPair currencyPair, List<ExchangeRate> exchangeRates)
      throws CantSaveExchangeRateException {
    List<String> exchangeRateTimestampsInDatabase = new ArrayList<>();

    DatabaseTable table =
        this.database.getTable(
            BitcoinVenezuelaProviderDatabaseConstants.DAILY_EXCHANGE_RATES_TABLE_NAME);
    table.addStringFilter(
        BitcoinVenezuelaProviderDatabaseConstants.DAILY_EXCHANGE_RATES_FROM_CURRENCY_COLUMN_NAME,
        currencyPair.getFrom().getCode(),
        DatabaseFilterType.EQUAL);
    table.addStringFilter(
        BitcoinVenezuelaProviderDatabaseConstants.DAILY_EXCHANGE_RATES_TO_CURRENCY_COLUMN_NAME,
        currencyPair.getTo().getCode(),
        DatabaseFilterType.EQUAL);

    try {
      table.loadToMemory();

      for (DatabaseTableRecord record : table.getRecords()) {
        String timestamp =
            record.getStringValue(
                BitcoinVenezuelaProviderDatabaseConstants
                    .DAILY_EXCHANGE_RATES_TIMESTAMP_COLUMN_NAME);
        exchangeRateTimestampsInDatabase.add(timestamp);
      }
    } catch (CantLoadTableToMemoryException e) {
      throw new CantSaveExchangeRateException(
          CantSaveExchangeRateException.DEFAULT_MESSAGE,
          e,
          "Failed to get ExchangeRates in database for CurrencyPair: " + currencyPair.toString(),
          "Couldn't load table to memory");
    }

    for (ExchangeRate e : exchangeRates) {
      String currentTimestamp = String.valueOf(e.getTimestamp());
      if (!exchangeRateTimestampsInDatabase.contains(currentTimestamp)) {
        this.saveDailyExchangeRate(e); // TODO: improve this.. saving one by one..
      }
    }
  }
  public List<ExchangeRate> getQueriedExchangeRateHistory(
      ExchangeRateType exchangeRateType, CurrencyPair currencyPair)
      throws CantGetExchangeRateException {
    List<ExchangeRate> exchangeRateList = new ArrayList<>();
    DatabaseTable table = null;

    switch (exchangeRateType) {
      case CURRENT:
        table =
            this.database.getTable(
                BitcoinVenezuelaProviderDatabaseConstants.CURRENT_EXCHANGE_RATES_TABLE_NAME);
        table.addStringFilter(
            BitcoinVenezuelaProviderDatabaseConstants
                .CURRENT_EXCHANGE_RATES_FROM_CURRENCY_COLUMN_NAME,
            currencyPair.getFrom().getCode(),
            DatabaseFilterType.EQUAL);
        table.addStringFilter(
            BitcoinVenezuelaProviderDatabaseConstants
                .CURRENT_EXCHANGE_RATES_TO_CURRENCY_COLUMN_NAME,
            currencyPair.getTo().getCode(),
            DatabaseFilterType.EQUAL);
        break;
      case DAILY:
        table =
            this.database.getTable(
                BitcoinVenezuelaProviderDatabaseConstants.DAILY_EXCHANGE_RATES_TABLE_NAME);
        table.addStringFilter(
            BitcoinVenezuelaProviderDatabaseConstants
                .DAILY_EXCHANGE_RATES_FROM_CURRENCY_COLUMN_NAME,
            currencyPair.getFrom().getCode(),
            DatabaseFilterType.EQUAL);
        table.addStringFilter(
            BitcoinVenezuelaProviderDatabaseConstants.DAILY_EXCHANGE_RATES_TO_CURRENCY_COLUMN_NAME,
            currencyPair.getTo().getCode(),
            DatabaseFilterType.EQUAL);
        break;
    }

    try {
      table.loadToMemory();

      for (DatabaseTableRecord record : table.getRecords()) {
        ExchangeRate exchangeRate = constructExchangeRateFromRecord(record);
        exchangeRateList.add(exchangeRate);
      }
    } catch (CantLoadTableToMemoryException e) {
      throw new CantGetExchangeRateException(
          CantGetExchangeRateException.DEFAULT_MESSAGE,
          e,
          "Failed to get History for currencyPair: " + currencyPair.toString(),
          "Couldn't load table to memory");
    } catch (CantCreateExchangeRateException e) {
      throw new CantGetExchangeRateException(
          CantGetExchangeRateException.DEFAULT_MESSAGE,
          e,
          "Failed to get History for currencyPair: " + currencyPair.toString(),
          "Couldn't create ExchangeRate object");
    }

    return exchangeRateList;
  }