Я пытаюсь получить следующее поведение в своем потоке:
Излучить столько объектов узлов, сколько сделок и CashTransaction в отчете XML -> работает
Получить идентификатор транзакции для каждого испускаемого узла -> рабочий
Проверка ИД транзакции Foreach, если она уже используетсяFirebaseDatabase -> Не работает
public static Observable<Boolean> run()
{
return IBRepository.getInstance().getReferenceCode().flatMap((Function<String, ObservableSource<String>>)
referenceCode -> IBRepository.getInstance().getXMLReport(referenceCode))
.flatMap((Function<String, Observable<Boolean>>) xmlString ->
{
Document xmlReport = XML.convertStringToXMLDocument(xmlString);
if(xmlReport != null)
{
return Observable.fromIterable(XML.iterable(xmlReport.getElementsByTagName(IBConstants.CashTransactionNode)))
.mergeWith(Observable.fromIterable(XML.iterable(xmlReport.getElementsByTagName(IBConstants.TradeNode))))
.flatMap((Function<Node, ObservableSource<String>>) Task_RetrieveNewOperations::getTransactionID)
.flatMap(transactionID -> FirebaseClass.getInstance().checkIfNewOperation(transactionID));
}
else
{
return Observable.error(new Throwable("xml report = null"));
}
});
}
Я вижу, что этот метод вызывается столько раз, сколько узлов вXML-файл, поэтому я думаю, что до этого момента все в порядке.
FirebaseClass.getInstance().checkIfNewOperation(transactionID)
Затем я покажу вам этот метод:
public Observable<Boolean> checkIfNewOperation(String transactionID)
{
return RxFirebaseDatabase.observeSingleValueEvent(operationsRef.orderByChild("TransactionID").equalTo(transactionID))
.flatMap((Function<DataSnapshot, MaybeSource<Boolean>>) dataSnapshot -> Maybe.just(dataSnapshot.exists())).toObservable()
.onErrorResumeNext(throwable ->
{
if (throwable instanceof NoSuchElementException)
{
return Observable.just(true);
}
else
{
return Observable.error(throwable);
}
});
}
Цель состоит в том, чтобы испустить результат этого методадля каждого ID транзакции (если идентификатор транзакции уже существует или нет). RxFirebaseDatabase.observeSingleValueEvent возвращает значение Maybe, которое в случае пустого состояния создает исключение NoSuchElementException. Я хочу пропустить это исключение и вернуть true в этом случае, потому что это означает, что идентификатор транзакции отсутствует в базе данных, а затем следуют следующие элементы.
Проблема заключается в том, что при выполнении этого кода я вижу, каквсе идентификаторы транзакций генерируются правильно, но тогда я получаю только один истинный / ложный элемент в наблюдателе.
Есть идеи о том, что может произойти?