Scala尾递归赋能业务

业务背景

因为公司有多个公众号,并且是各不相同的商户主体,所以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尾递归赋能业务)