Как вернуть объект с карты другого типа? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь написать массовое сохранение или обновить функциональность. Если записи считываются из файла CSV и преобразуются в соответствующий класс, а затем для этой записи выполняется сохранение или обновление.

Ниже приведены шаги для сохранения или обновления

  1. Получить из БД по emailId. (Возможно, возвращается)
  2. Если пользователь существует, сохраните его, чтобы обновить.

  3. В случае успешной работы БД, вернуть Single типа Report. Здесь Report является пользовательским классом.

 Flowable.fromPublisher(userRepository.findByEmail(user.emailId)).firstElement()

Этот код возвращает MayBe, по этому я хочу вызвать Save / Update, который возвращает Single или error. В любом случае я хочу вернуть Single типа Report

Ниже приведен пример кода, который я пытался заблокировать, но я хочу сделать это неблокирующим образом

   @Override
    Single<BulkUploadReport> processData(String nextLine) {
        List<Object> errors = new ArrayList<>()

        Single.create({ emitter ->

            def parsedString = parseCsv(nextLine, readFirstLine: true, columnNames: columnNames)
            for (record in parsedString) {


                try {
                    User user = parseRecord(record)
                    List<String> roles = parseRoles(record[14])


                   User dbUser =  Flowable.fromPublisher(userRepository.findByEmail(user.emailId)).firstElement().blockingGet()

                    if(dbUser == null){
                         userService.save(user, user.emailId, roles, saveUserkey).blockingGet()

                    }else{
                        user.userkey = dbUser.userkey
                         Single.fromPublisher(userRepository.updateUser(saveUserkey, user)).blockingGet()

                    }
                    emitter.onSuccess(new BulkUploadReport(record[0] as int, true, null))
                } catch (Exception e) {
                    log.error("Error in bulk update.Handled grac8efully:  ${e.getMessage()}")
                    ArrayList<String> err = e.getMessage().tokenize(",") as ArrayList<String>
                    errors.addAll(err)
                    emitter.onSuccess(new BulkUploadReport(record[0] as int, false,errors))
                }

            }

        }) as Single<BulkUploadReport>
    }

UserRepository:

 Publisher<User> updateUser(String saveUserKey, User user)
 Publisher<User> findByEmail(String emailId)
 Publisher<Success> insertUser(User user)

Я новичок в RxJava и не понимаю, как связать эти события.

1 Ответ

0 голосов
/ 22 мая 2019

По моему мнению, вам следует избегать всех вызовов blockingGet() (что на самом деле не является философией Rx) и пытаться связать процесс с вызовами методов Rx.В вашем фрагменте кода неясно, пытаетесь ли вы обработать список пользователей или одного пользователя из CSV.Может быть, если бы вы могли поставить подпись parseCsv(), было бы яснее.Также не ясно, какой метод может вызвать исключение.

Если когда-либо один пользователь извлекается из CSV, вот ответ с псевдокодом, который может помочь:

public Single<BulkUploadReport> processData(String line) {
    final Record record = parseCsv(line, true, columNames);
    final User user = parseRecord(record);
    final List<String> roles = parseRoles(record);

    return Flowable.fromPublisher(userRepository.findByEmail(user.emailId))
                   .firstElement()
                   .switchIfEmpty(Maybe.just(userService.save(user, user.emailId, roles, saveUserkey)))
                   .map(aUser -> new BulkUploadReport(record, false))
                   .toSingle();
}

Надеюсь, это поможет.

...