@Override
  public Page<AddressLocationDetails> retrieveAllAddressLocations(
      final SearchSqlQuery searchAddresses) {
    try {
      context.authenticatedUser();
      final AddressLocationMapper locationMapper = new AddressLocationMapper();

      final StringBuilder sqlBuilder = new StringBuilder(200);
      sqlBuilder.append("select ");
      sqlBuilder.append(locationMapper.schema());
      String sqlSearch = searchAddresses.getSqlSearch();
      String extraCriteria = "";
      if (sqlSearch != null) {
        sqlSearch = sqlSearch.trim();
        extraCriteria = "  where country_name like '%" + sqlSearch + "%' ";
      }

      sqlBuilder.append(extraCriteria);

      if (searchAddresses.isLimited()) {
        sqlBuilder.append(" limit ").append(searchAddresses.getLimit());
      }
      if (searchAddresses.isOffset()) {
        sqlBuilder.append(" offset ").append(searchAddresses.getOffset());
      }
      return this.paginationHelper.fetchPage(
          this.jdbcTemplate,
          "SELECT FOUND_ROWS()",
          sqlBuilder.toString(),
          new Object[] {},
          locationMapper);
    } catch (final EmptyResultDataAccessException e) {
      return null;
    }
  }