美文网首页
Scala尾递归赋能业务

Scala尾递归赋能业务

作者: 吃板栗的猫 | 来源:发表于2019-07-18 20:46 被阅读0次

    业务背景

    因为公司有多个公众号,并且是各不相同的商户主体,所以wechat_openid并不是相通的,在会员模块为了兼容这几个不同的wechat_openid互通,所以产生了会员合并功能,就是一个会员允许有多个wechat_openid;
    我们通过一个merge表记录这些合并记录,保证数据的清晰度和完整性,有首有尾;
    举个栗子:
    • 会员1 : id = 1, wechat_openid = aaa
    • 会员2 : id = 2, wechat_openid = bbb
    • 会员2 与 会员1 进行合并
    • 合并后会员1 : id = 1, wechat_openid = List("aaa", "bbb")
    • 合并后会员2进行逻辑删除
    • merge_table : old_member_id = 2, new_member_id = 1
    所以如果说通过id=2去查询会员,如果主表查不到的话,就需要去merge表通过old_member_id查询,得到new_member_id之后再去主表查,如果主表还是查不到,就再去merge表循环查一次,因为公众号主体存在多个,所以存在循环查多次的情况,这是就可以使用Scala尾递归来进行查询优化;
     def queryMember(): Long = {
    
        @tailrec
        def tailrecmember(count: Int, memId: Long): Long = {
          val memberOpt: Option[Member] = MemberQuerySqlNew.getMemberByMemIdOrMobileOrOpenId(memberId = Some(memId), mobile = None, openId = None)
          if (memberOpt.isDefined) {
            memberOpt.get.id
          } else {
            val newMemberIdOpt: Option[Long] = MemberQuerySqlNew.getNewMemberIdByOldMemberId(memId)
            if (newMemberIdOpt.isDefined) {
              tailrecmember(count + 1, newMemberIdOpt.get)
            } else {
              assert(assertion = false, new MemberExceptionNew("Err-memberService", s"会员不存在${request.memberId}"))
              -1 // 如果主表和merge表都没有数据,这种情况肯定是有异常的,所以我们用一个assert异常
            }
          }
        }
    
        tailrecmember(1, request.memberId)
      }
    
    并且这个方法可以当作一个公共方法来实现member查询

    相关文章

      网友评论

          本文标题:Scala尾递归赋能业务

          本文链接:https://www.haomeiwen.com/subject/jnurlctx.html