Firestore - Android Java - Сделка - PullRequest
0 голосов
/ 20 января 2020

Я хотел бы знать, как я могу остановить операцию транзакции в 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()));
        }
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...