Я хотел бы знать, как я могу остановить операцию транзакции в Firestore. Функция повторяется много раз, но мне не нужно это делать, если условие выполнено. Например, пример, предоставленный онлайн-документацией:
https://firebase.google.com/docs/firestore/manage-data/transactions
Этот блок будет повторяться много раз, если newPopulation> 1000000. Я хочу сделать следующее:
, если newPopulation> 1000000, затем выйти из операции транзакции (не повторять попытку).
Моя программа позволяет клиенту сделать заказ, если есть смены. Количество слотов в смену составляет 4.
if (shiftQuantity == quantityTotalBookingByShift) {
throw new FirebaseFirestoreException(errorMsg1 + shift.toString() + errorMsg2,
FirebaseFirestoreException.Code.ABORTED);
}
. Приведенный выше код проверяет, есть ли в выбранных пользователем сменах 4 слота, транзакция отменяется. Итак, это причина моего вопроса. мой код ниже.
public void createBooking(final Booking booking, final Integer quantityTotalBookingByShift, final FirebaseListener listener) {
final DocumentReference counterDocRef = db.collection(bookingsCollectionPath).document(counterDocument);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.YYYY");
final String dateAux = formatter.format(booking.getDate());
final DocumentReference dateRef = db.collection(bookingByDateCollectionPath).document(dateAux);
db.runTransaction(new Transaction.Function<Integer>() {
@Nullable
@Override
public Integer apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
final String idBookingCounter = "idBooking";
final String listOfBookings = "ListOfBookings";
// Read
DocumentSnapshot counterSnapshot = transaction.get(counterDocRef);
Integer counter = Integer.parseInt(String.valueOf(counterSnapshot.getLong(idBookingCounter)));
counter++;
booking.setId(counter);
DocumentSnapshot dateSnapshot = transaction.get(dateRef);
Integer shiftQuantity;
for (Shift shift: booking.getShifts()) {
shiftQuantity = Integer.parseInt(String.valueOf(dateSnapshot.getLong(shift.getId().toString())));
if (shiftQuantity == quantityTotalBookingByShift) {
throw new FirebaseFirestoreException(errorMsg1 + shift.toString() + errorMsg2,
FirebaseFirestoreException.Code.ABORTED);
}
}
// Write counter
transaction.update(counterDocRef, idBookingCounter, counter);
//write increment shift booking
for (Shift shift: booking.getShifts()) {
shiftQuantity = Integer.parseInt(String.valueOf(dateSnapshot.getLong(shift.getId().toString()))) + 1;
transaction.update(dateRef, shift.getId().toString(), shiftQuantity);
}
// write bookings
DocumentReference bookingsDocRef = db.collection(bookingsCollectionPath).document(booking.getId().toString());
Map<String, Object> bookingToSave = createDataBookingToSave(booking);
transaction.set(bookingsDocRef, bookingToSave);
// write booking inside the user subtree
transaction.set(db.collection(bookingByUserCollectionPath).document(booking.getUser().getId()).collection(listOfBookings).document(booking.getId().toString()), bookingToSave);
return counter;
}
private Map<String, Object> createDataBookingToSave(Booking booking) {
Map<String, Object> docDataBooking = new HashMap<>();
docDataBooking.put("id", booking.getId());
docDataBooking.put("date", new Timestamp(java.sql.Date.valueOf(booking.getDate().toString())));
docDataBooking.put("createdAt", FieldValue.serverTimestamp());
docDataBooking.put("type", booking.getType());
docDataBooking.put("comments", booking.getComments());
docDataBooking.put("vehicle", booking.getVehicle().getNumberPlate());
docDataBooking.put("status", booking.getStatus());
docDataBooking.put("shifts", booking.getShifts());
docDataBooking.put("user", booking.getUser().getId());
return docDataBooking;
}
}).addOnSuccessListener(new OnSuccessListener<Integer>() {
@Override
public void onSuccess(Integer aLong) {
listener.onSuccess(aLong);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
listener.onFailure(new FirebaseException(e.getMessage()));
}
});
}