直接合并hash分组,不适用缓存。 @param keyHintFrom from @param keyHintTo to
(BConcurrentKey keyHintFrom, BConcurrentKey keyHintTo)
| 438 | * @param keyHintTo to |
| 439 | */ |
| 440 | public void mergeRank(BConcurrentKey keyHintFrom, BConcurrentKey keyHintTo) { |
| 441 | if (keyHintFrom.getRankType() != keyHintTo.getRankType() |
| 442 | || keyHintFrom.getTimeType() != keyHintTo.getTimeType() |
| 443 | || keyHintFrom.getYear() != keyHintTo.getYear()) |
| 444 | throw new RuntimeException("rank type mismatch."); |
| 445 | |
| 446 | if (keyHintFrom.getOffset() == keyHintTo.getOffset())// same hint |
| 447 | return; |
| 448 | |
| 449 | int concurrentLevel = getConcurrentLevel(keyHintFrom.getRankType()); |
| 450 | int countNeed = getComputeCount(keyHintFrom.getRankType()); |
| 451 | for (int i = 0; i < concurrentLevel; ++i) { |
| 452 | var concurrentKeyFrom = new BConcurrentKey(keyHintFrom.getRankType(), i, keyHintFrom.getTimeType(), |
| 453 | keyHintFrom.getYear(), keyHintFrom.getOffset()); |
| 454 | var concurrentKeyTo = new BConcurrentKey(keyHintTo.getRankType(), i, keyHintTo.getTimeType(), |
| 455 | keyHintTo.getYear(), keyHintTo.getOffset()); |
| 456 | var from = _trank.getOrAdd(concurrentKeyFrom); |
| 457 | // 把from里面的所有玩家从目标列表中清除。 |
| 458 | for (var j = 0; j < from.getRankList().size(); ++j) |
| 459 | _removeRank(i, keyHintTo, from.getRankList().get(j).getRoleId(), null); |
| 460 | // 合并到目标列表中。 |
| 461 | var merged = merge(_trank.getOrAdd(concurrentKeyTo), from); |
| 462 | // 删除多余的数量。 |
| 463 | if (merged.getRankList().size() > countNeed) { // 再次删除多余的结果。 |
| 464 | //noinspection ListRemoveInLoop |
| 465 | for (int ir = merged.getRankList().size() - 1; ir >= countNeed; --ir) |
| 466 | merged.getRankList().remove(ir); |
| 467 | } |
| 468 | // 保存列表。 |
| 469 | _trank.put(concurrentKeyTo, merged); |
| 470 | } |
| 471 | } |
| 472 | |
| 473 | /** |
| 474 | * 直接查询数据库并合并分组数据。直接查询没有使用缓存。 |
nothing calls this directly
no test coverage detected