Commit f91a0902 authored by Nabhan Abdulla's avatar Nabhan Abdulla
Browse files

Add solution

parent 665a1384
......@@ -21,7 +21,14 @@ repositories {
}
dependencies {
compile 'org.mongodb:mongo-java-driver:2.12.3'
// https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver
compile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.12.7'
// https://mvnrepository.com/artifact/org.json/json
compile group: 'org.json', name: 'json', version: '20200518'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.0.1'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb', version: '2.2.4.RELEASE'
}
application {
......
......@@ -3,19 +3,169 @@
*/
package project;
import java.net.UnknownHostException;
import java.util.Set;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.client.MongoClient;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
// import com.mongodb.MongoClient;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoClientURI;
import com.mongodb.bulk.UpdateRequest;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
// import com.mongodb.diagnostics.logging.Logger;
import com.mongodb.diagnostics.logging.Loggers;
import java.time.Duration;
import java.time.LocalDate;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
public class App {
public static void main(String[] args) {
System.out.println("App running!");
public static void main(String[] args)
throws JsonParseException, JsonMappingException, IOException, ParseException {
System.out.println("App running!");
// Add settings to support inserting POJO data
// http://mongodb.github.io/mongo-java-driver/3.7/driver/getting-started/quick-start-pojo/
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
MongoClientSettings settings = MongoClientSettings.builder().codecRegistry(pojoCodecRegistry).build();
// Create a MongoDB connection
MongoClient mongoClient = MongoClients.create(settings);
// Create a MongoDB connection
// MongoClient mongoClient = new MongoClient(new
// MongoClientURI("mongodb://localhost:27017"));
// TODO: Create a new database - myTravels
// Database will be auto-created on adding data
MongoDatabase database = mongoClient.getDatabase("myTravels");
MongoCollection<ReservationDTO> collection = database.getCollection("reservations", ReservationDTO.class);
// TODO: Insert data to reservations collection in the myTravels database
// use jackson to read json data stored in file
// each of the reservation will be an object of the ReservationDTO class
File file = new File("src/main/resources/data.json");
ObjectMapper objectMapper = new ObjectMapper();
ReservationDTO[] reservations = objectMapper.readValue(file, ReservationDTO[].class);
for (ReservationDTO reservation : reservations) {
// parse string as DBObject object
System.out.println(reservation);
// insert data to the collection
collection.insertOne(reservation);
}
// TODO: Read all the data stored in the collection
// Read all reservations as an Iterator and print each out
Iterator<ReservationDTO> cursorReadAll = collection.find().iterator();
System.out.println("\n\nPrinting all the reservations");
while (cursorReadAll.hasNext()) {
ReservationDTO reservationRead = cursorReadAll.next();
System.out.println(reservationRead);
}
// TODO: Read all reservations for New York city
// Create query to filter the reservations data
BasicDBObject queryReadFilterByCity = new BasicDBObject();
queryReadFilterByCity.put("city", "New York");
Iterator<ReservationDTO> cursorReadByFilter = collection.find(queryReadFilterByCity).iterator();
System.out.println("\n\nPrinting all reservations for New York city");
while (cursorReadByFilter.hasNext()) {
ReservationDTO reservationRead = cursorReadByFilter.next();
System.out.println(reservationRead);
}
// TODO: Update all the reservations for Delhi to Bangalore
BasicDBObject queryUpdateFilterByCity = new BasicDBObject();
queryUpdateFilterByCity.put("city", "Delhi");
BasicDBObject updateObjectByCity = new BasicDBObject();
updateObjectByCity.put("city", "Bangalore");
BasicDBObject setObjectByCity = new BasicDBObject();
setObjectByCity.put("$set", updateObjectByCity);
// Iterator<ReservationDTO> cursorUpdateByFilter =
// collection.find(queryUpdateFilterByCity).iterator();
System.out.println("\n\nUpdating all reservations for Delhi to Banagalore");
UpdateResult updateResultFilterByCity = collection.updateMany(queryUpdateFilterByCity, setObjectByCity);
System.out.println(updateResultFilterByCity.getModifiedCount());
// while (cursorUpdateByFilter.hasNext()) {
// ReservationDTO reservationToUpdate = cursorUpdateByFilter.next();
// reservationToUpdate.setCity("Bangalore");
// }
// TODO: Increment stay by 1 day if total booked for more than or equal to 7
// days
Iterator<ReservationDTO> cursorIncrementStay = collection.find().iterator();
System.out.println("\n\nIncrementing stay for customers who reserved for >= 7 days");
int count = 0;
while (cursorIncrementStay.hasNext()) {
ReservationDTO reservationIncrementStay = cursorIncrementStay.next();
// parse date from String to Java date datatype
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
LocalDateTime starts_at = LocalDateTime.parse(reservationIncrementStay.getStarts_at(), dateTimeFormatter);
LocalDateTime ends_at = LocalDateTime.parse(reservationIncrementStay.getEnds_at(), dateTimeFormatter);
long numberOfDaysReserved = Duration.between(starts_at, ends_at).toDays();
if (numberOfDaysReserved >= 7) {
// create filter query for getting document with _id value
BasicDBObject queryUpdateIncrementStay = new BasicDBObject();
queryUpdateIncrementStay.put("_id", reservationIncrementStay.getId());
// create update query for updating the ends_at value
BasicDBObject updateObjectIncrementStay = new BasicDBObject();
String updatedEndsAt = ends_at.plusDays(1).toString();
updateObjectIncrementStay.put("ends_at", updatedEndsAt);
BasicDBObject setObjectIncrementStay = new BasicDBObject();
setObjectIncrementStay.put("$set", updateObjectIncrementStay);
// update the document by addingn an additional day to ends_at
UpdateResult updateResultIncrementStay = collection.updateOne(queryUpdateIncrementStay, setObjectIncrementStay);
count += updateResultIncrementStay.getModifiedCount();
}
}
System.out.println(count);
// TODO: Delete all the reservations for New York city
BasicDBObject queryDeleteByCity = new BasicDBObject();
queryDeleteByCity.put("city", "New York");
System.out.println("\n\nDeleting all reservations for New York city");
DeleteResult deleteResultFilterByCity = collection.deleteMany(queryDeleteByCity);
System.out.println(deleteResultFilterByCity.getDeletedCount());
}
}
package project;
import org.bson.types.ObjectId;
public class ReservationDTO {
private ObjectId id;
private String reservation_id;
private String city;
private String starts_at;
private String ends_at;
public String getReservation_id() {
return reservation_id;
}
public void setReservation_id(String reservation_id) {
this.reservation_id = reservation_id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStarts_at() {
return starts_at;
}
public void setStarts_at(String starts_at) {
this.starts_at = starts_at;
}
public String getEnds_at() {
return ends_at;
}
public void setEnds_at(String ends_at) {
this.ends_at = ends_at;
}
public ObjectId getId() {
return id;
}
public void setId(final ObjectId id) {
this.id = id;
}
@Override
public String toString() {
return "ReservationDTO [_id=" + id + ", city=" + city + ", ends_at=" + ends_at + ", reservation_id="
+ reservation_id + ", starts_at=" + starts_at + "]";
}
}
\ No newline at end of file
server.port:8081
# Mongo
# spring.data.mongodb.uri=mongodb://localhost:27017/reservations?authSource=admin
# spring.data.mongodb.uri=mongodb://localhost:27017/reservations?authSource=admin
\ No newline at end of file
[
{ "reservation_id" : "106453A1D", "city" : "New York", "starts_at" : "2019-06-04T20:13:58", "ends_at" : "2019-06-18T20:13:58" },
{ "reservation_id" : "3492A55CE", "city" : "New York", "starts_at" : "2019-06-02T20:13:58", "ends_at" : "2019-06-03T20:13:58" },
{ "reservation_id" : "2DA771871", "city" : "Delhi", "starts_at" : "2019-06-01T20:13:58", "ends_at" : "2019-06-06T20:13:58" },
{ "reservation_id" : "1DA771871", "city" : "Mumbai", "starts_at" : "2020-06-04T20:13:58", "ends_at" : "2020-06-16T20:13:58" }
]
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment