Skip to content

Commit 2bcfd1c

Browse files
committed
Add spring boot pagination and verified integration tests
1 parent b134df5 commit 2bcfd1c

18 files changed

+158
-78
lines changed

src/main/java/org/couchbase/quickstart/springboot/controllers/AirlineController.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.web.bind.annotation.PutMapping;
1717
import org.springframework.web.bind.annotation.RequestBody;
1818
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.RequestParam;
1920
import org.springframework.web.bind.annotation.RestController;
2021

2122
import com.couchbase.client.core.error.DocumentExistsException;
@@ -113,9 +114,11 @@ public ResponseEntity<Void> deleteAirline(@PathVariable String id) {
113114

114115
@Operation(summary = "List all airlines")
115116
@GetMapping("/list")
116-
public ResponseEntity<List<Airline>> listAirlines() {
117+
public ResponseEntity<List<Airline>> listAirlines(
118+
@RequestParam(defaultValue = "10") int limit,
119+
@RequestParam(defaultValue = "0") int offset) {
117120
try {
118-
List<Airline> airlines = airlineService.listAirlines();
121+
List<Airline> airlines = airlineService.listAirlines(limit, offset);
119122
return new ResponseEntity<>(airlines, HttpStatus.OK);
120123
} catch (Exception e) {
121124
log.error(INTERNAL_SERVER_ERROR + ": " + e.getMessage());
@@ -125,9 +128,11 @@ public ResponseEntity<List<Airline>> listAirlines() {
125128

126129
@Operation(summary = "List all airlines by country")
127130
@GetMapping("/country/{country}")
128-
public ResponseEntity<List<Airline>> listAirlinesByCountry(@PathVariable String country) {
131+
public ResponseEntity<List<Airline>> listAirlinesByCountry(@PathVariable String country,
132+
@RequestParam(defaultValue = "10") int limit,
133+
@RequestParam(defaultValue = "0") int offset) {
129134
try {
130-
List<Airline> airlines = airlineService.listAirlinesByCountry(country);
135+
List<Airline> airlines = airlineService.listAirlinesByCountry(country, limit, offset);
131136
return new ResponseEntity<>(airlines, HttpStatus.OK);
132137
} catch (Exception e) {
133138
log.error(INTERNAL_SERVER_ERROR + ": " + e.getMessage());
@@ -138,9 +143,11 @@ public ResponseEntity<List<Airline>> listAirlinesByCountry(@PathVariable String
138143
@Operation(summary = "List all airlines by destination airport")
139144
@GetMapping("/destination/{destinationAirport}")
140145
public ResponseEntity<List<Airline>> listAirlinesByDestinationAirport(
141-
@PathVariable String destinationAirport) {
146+
@PathVariable String destinationAirport,
147+
@RequestParam(defaultValue = "10") int limit,
148+
@RequestParam(defaultValue = "0") int offset) {
142149
try {
143-
List<Airline> airlines = airlineService.listAirlinesByDestinationAirport(destinationAirport);
150+
List<Airline> airlines = airlineService.listAirlinesByDestinationAirport(destinationAirport, limit, offset);
144151
return new ResponseEntity<>(airlines, HttpStatus.OK);
145152
} catch (Exception e) {
146153
log.error(INTERNAL_SERVER_ERROR + ": " + e.getMessage());

src/main/java/org/couchbase/quickstart/springboot/controllers/AirportController.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.springframework.web.bind.annotation.PutMapping;
1818
import org.springframework.web.bind.annotation.RequestBody;
1919
import org.springframework.web.bind.annotation.RequestMapping;
20+
import org.springframework.web.bind.annotation.RequestParam;
2021
import org.springframework.web.bind.annotation.RestController;
2122

2223
import com.couchbase.client.core.error.DocumentExistsException;
@@ -113,9 +114,11 @@ public ResponseEntity<Void> deleteAirport(@PathVariable String id) {
113114

114115
@Operation(summary = "List all airports")
115116
@GetMapping("/list")
116-
public ResponseEntity<List<Airport>> listAirports() {
117+
public ResponseEntity<List<Airport>> listAirports(
118+
@RequestParam(defaultValue = "10") int limit,
119+
@RequestParam(defaultValue = "0") int offset) {
117120
try {
118-
List<Airport> airports = airportService.listAirports();
121+
List<Airport> airports = airportService.listAirports(limit, offset);
119122
return new ResponseEntity<>(airports, HttpStatus.OK);
120123
} catch (Exception e) {
121124
log.error(INTERNAL_SERVER_ERROR + ": " + e.getMessage());
@@ -125,10 +128,13 @@ public ResponseEntity<List<Airport>> listAirports() {
125128

126129
@Operation(summary = "List all direct connections from an airport")
127130
@GetMapping("/direct-connections/{airportCode}")
128-
public ResponseEntity<List<String>> listDirectConnections(@PathVariable String airportCode) {
131+
public ResponseEntity<List<String>> listDirectConnections(@PathVariable String airportCode,
132+
@RequestParam(defaultValue = "10") int limit,
133+
@RequestParam(defaultValue = "0") int offset) {
129134
try {
130-
List<String> destinationAirports = airportService.listDirectConnections(airportCode).stream()
131-
.map(Route::getDestinationairport).collect(Collectors.toList());
135+
List<String> destinationAirports = airportService.listDirectConnections(airportCode, limit, offset).stream()
136+
.map(Route::getDestinationairport)
137+
.collect(Collectors.toList());
132138
return new ResponseEntity<>(destinationAirports, HttpStatus.OK);
133139
} catch (Exception e) {
134140
log.error(INTERNAL_SERVER_ERROR + ": " + e.getMessage());

src/main/java/org/couchbase/quickstart/springboot/controllers/RouteController.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.web.bind.annotation.PutMapping;
1717
import org.springframework.web.bind.annotation.RequestBody;
1818
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.RequestParam;
1920
import org.springframework.web.bind.annotation.RestController;
2021

2122
import com.couchbase.client.core.error.DocumentExistsException;
@@ -113,9 +114,11 @@ public ResponseEntity<Void> deleteRoute(@PathVariable String id) {
113114

114115
@Operation(summary = "List all routes")
115116
@GetMapping("/list")
116-
public ResponseEntity<List<Route>> listRoutes() {
117+
public ResponseEntity<List<Route>> listRoutes(
118+
@RequestParam(defaultValue = "10") int limit,
119+
@RequestParam(defaultValue = "0") int offset) {
117120
try {
118-
List<Route> routes = routeService.listRoutes();
121+
List<Route> routes = routeService.listRoutes(limit, offset);
119122
return new ResponseEntity<>(routes, HttpStatus.OK);
120123
} catch (Exception e) {
121124
log.error(INTERNAL_SERVER_ERROR + ": " + e.getMessage());

src/main/java/org/couchbase/quickstart/springboot/repositories/AirlineRepository.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@
66

77
public interface AirlineRepository {
88
Airline findById(String id);
9+
910
Airline save(Airline airline);
11+
1012
Airline update(String id, Airline airline);
13+
1114
void delete(String id);
12-
List<Airline> findAll();
13-
List<Airline> findByCountry(String country);
14-
List<Airline> findByDestinationAirport(String country);
15+
16+
List<Airline> findAll(int limit, int offset);
17+
18+
List<Airline> findByCountry(String country, int limit, int offset);
19+
20+
List<Airline> findByDestinationAirport(String destinationAirport, int limit, int offset);
1521
}

src/main/java/org/couchbase/quickstart/springboot/repositories/AirlineRepositoryImpl.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,19 @@ public void delete(String id) {
5454
}
5555

5656
@Override
57-
public List<Airline> findAll() {
57+
public List<Airline> findAll(int limit, int offset) {
5858
String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
59-
+ dbProperties.getBucketName() + "`.`inventory`.`airline`";
59+
+ dbProperties.getBucketName() + "`.`inventory`.`airline` LIMIT " + limit + " OFFSET " + offset;
6060
return cluster
6161
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
6262
.rowsAs(Airline.class);
6363
}
6464

6565
@Override
66-
public List<Airline> findByCountry(String country) {
66+
public List<Airline> findByCountry(String country, int limit, int offset) {
6767
String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
68-
+ dbProperties.getBucketName() + "`.`inventory`.`airline` WHERE country = '" + country + "'";
68+
+ dbProperties.getBucketName() + "`.`inventory`.`airline` WHERE country = '" + country + "' LIMIT "
69+
+ limit + " OFFSET " + offset;
6970
return cluster
7071
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS)
7172
.parameters(JsonObject.create().put("country", country)))
@@ -74,15 +75,15 @@ public List<Airline> findByCountry(String country) {
7475
}
7576

7677
@Override
77-
public List<Airline> findByDestinationAirport(String destinationAirport) {
78+
public List<Airline> findByDestinationAirport(String destinationAirport, int limit, int offset) {
7879
String statement = "SELECT air.callsign, air.country, air.iata, air.icao, air.id, air.name, air.type " +
7980
"FROM (SELECT DISTINCT META(airline).id AS airlineId " +
8081
" FROM `" + dbProperties.getBucketName() + "`.`inventory`.`route` " +
8182
" JOIN `" + dbProperties.getBucketName() + "`.`inventory`.`airline` " +
8283
" ON route.airlineid = META(airline).id " +
8384
" WHERE route.destinationairport = $1) AS subquery " +
8485
"JOIN `" + dbProperties.getBucketName() + "`.`inventory`.`airline` AS air " +
85-
"ON META(air).id = subquery.airlineId";
86+
"ON META(air).id = subquery.airlineId LIMIT " + limit + " OFFSET " + offset;
8687

8788
return cluster.query(
8889
statement,

src/main/java/org/couchbase/quickstart/springboot/repositories/AirportRepository.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ public interface AirportRepository {
1515

1616
void delete(String id);
1717

18-
List<Airport> findAll();
19-
20-
List<Route> findDirectConnections(String airportCode);
18+
List<Airport> findAll(int limit, int offset);
2119

20+
List<Route> findDirectConnections(String airportCode, int limit, int offset);
2221
}

src/main/java/org/couchbase/quickstart/springboot/repositories/AirportRepositoryImpl.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,36 +29,43 @@ public AirportRepositoryImpl(Cluster cluster, Bucket bucket, DBProperties dbProp
2929
this.dbProperties = dbProperties;
3030
}
3131

32+
@Override
3233
public Airport findById(String id) {
3334
return airportCol.get(id).contentAs(Airport.class);
3435
}
3536

37+
@Override
3638
public Airport save(Airport airport) {
3739
airportCol.insert(airport.getId(), airport);
3840
return airport;
3941
}
4042

43+
@Override
4144
public Airport update(String id, Airport airport) {
4245
airportCol.replace(id, airport);
4346
return airport;
4447
}
4548

49+
@Override
4650
public void delete(String id) {
4751
airportCol.remove(id);
4852
}
4953

50-
public List<Airport> findAll() {
51-
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`airport`";
54+
@Override
55+
public List<Airport> findAll(int limit, int offset) {
56+
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`airport` LIMIT "
57+
+ limit + " OFFSET " + offset;
5258
return cluster
5359
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
5460
.rowsAs(Airport.class);
5561
}
5662

57-
public List<Route> findDirectConnections(String airportCode) {
63+
@Override
64+
public List<Route> findDirectConnections(String airportCode, int limit, int offset) {
5865
String statement = "SELECT route.* FROM `" + dbProperties.getBucketName()
5966
+ "`.`inventory`.`airport` as airport JOIN `" + dbProperties.getBucketName()
6067
+ "`.`inventory`.`route` as route on route.sourceairport = airport.faa WHERE airport.faa = \""
61-
+ airportCode + "\" and route.stops = 0";
68+
+ airportCode + "\" and route.stops = 0 LIMIT " + limit + " OFFSET " + offset;
6269
return cluster
6370
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
6471
.rowsAs(Route.class);

src/main/java/org/couchbase/quickstart/springboot/repositories/RouteRepository.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@
66

77
public interface RouteRepository {
88
Route findById(String id);
9+
910
Route save(Route route);
11+
1012
Route update(String id, Route route);
13+
1114
void delete(String id);
12-
List<Route> findAll();
15+
16+
List<Route> findAll(int limit, int offset);
17+
1318
}

src/main/java/org/couchbase/quickstart/springboot/repositories/RouteRepositoryImpl.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,34 @@ public RouteRepositoryImpl(Cluster cluster, Bucket bucket, DBProperties dbProper
2929
this.dbProperties = dbProperties;
3030
}
3131

32+
@Override
3233
public Route findById(String id) {
3334
return routeCol.get(id).contentAs(Route.class);
3435
}
3536

37+
@Override
3638
public Route save(Route route) {
3739
routeCol.insert(route.getId(), route);
3840
return route;
3941
}
4042

43+
@Override
4144
public Route update(String id, Route route) {
4245
routeCol.replace(id, route);
4346
return route;
4447
}
4548

49+
@Override
4650
public void delete(String id) {
4751
routeCol.remove(id);
4852
}
4953

50-
public List<Route> findAll() {
51-
String statement = "SELECT route.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`route`";
54+
@Override
55+
public List<Route> findAll(int limit, int offset) {
56+
String statement = "SELECT route.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`route` LIMIT "
57+
+ limit + " OFFSET " + offset;
5258
return cluster
5359
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
5460
.rowsAs(Route.class);
5561
}
56-
5762
}

src/main/java/org/couchbase/quickstart/springboot/services/AirlineService.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@
66

77
public interface AirlineService {
88
Airline getAirlineById(String id);
9+
910
Airline createAirline(Airline airline);
11+
1012
Airline updateAirline(String id, Airline airline);
13+
1114
void deleteAirline(String id);
12-
List<Airline> listAirlines();
13-
List<Airline> listAirlinesByCountry(String country);
14-
List<Airline> listAirlinesByDestinationAirport(String destinationAirport);
15+
16+
List<Airline> listAirlines(int limit, int offset);
17+
18+
List<Airline> listAirlinesByCountry(String country, int limit, int offset);
19+
20+
List<Airline> listAirlinesByDestinationAirport(String destinationAirport, int limit, int offset);
1521
}

0 commit comments

Comments
 (0)