Skip to content

Feat: sort the recorded data in memory #115

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion arex-storage-config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.40</version>
<version>1.0.41</version>
</parent>

<properties>
Expand Down
2 changes: 1 addition & 1 deletion arex-storage-model/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.40</version>
<version>1.0.41</version>
</parent>

<profiles>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.arextest.model.replay;

import com.arextest.model.mock.AREXMocker;
import com.arextest.model.mock.Mocker;
import com.arextest.model.response.DesensitizationResponseType;
import com.arextest.model.response.Response;
import com.arextest.model.response.ResponseStatusType;
Expand All @@ -15,5 +15,5 @@
public class ViewRecordResponseType extends DesensitizationResponseType implements Response {

private ResponseStatusType responseStatusType;
private List<AREXMocker> recordResult;
private List<Mocker> recordResult;
}
2 changes: 1 addition & 1 deletion arex-storage-web-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
<parent>
<artifactId>arex-storage-service</artifactId>
<groupId>com.arextest</groupId>
<version>1.0.40</version>
<version>1.0.41</version>
</parent>

<profiles>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.arextest.storage.mock;

import com.arextest.common.utils.JsonTraverseUtils;
import com.arextest.model.mock.AREXMocker;
import com.arextest.model.mock.Mocker;
import com.arextest.storage.utils.JsonUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
Expand All @@ -10,9 +9,9 @@

public class MockerPostProcessor {

public static void desensitize(List<AREXMocker> allReadableResult)
public static void desensitize(List<Mocker> allReadableResult)
throws JsonProcessingException {
for (AREXMocker arexMocker : allReadableResult) {
for (Mocker arexMocker : allReadableResult) {
Mocker.Target request = arexMocker.getTargetRequest();
Mocker.Target response = arexMocker.getTargetResponse();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -76,41 +77,33 @@ public <T extends Mocker> boolean putRecordResult(MockCategoryType category, Str
Iterator<T> valueIterator = values.iterator();
int size = 0;
byte[] recordKey = CacheKeyUtils.buildRecordKey(category, recordIdBytes);
boolean shouldUseIdOfInstanceToMockResult = shouldUseIdOfInstanceToMockResult(category);
boolean shouldRecordCallReplayMax = shouldRecordCallReplayMax(category);

// Records the maximum number of operations corresponding to recorded data
if (shouldUseIdOfInstanceToMockResult) {
List<T> mockList = new ArrayList<>();
// Obtain the number of the same interfaces in recorded data
while (valueIterator.hasNext()) {
T value = valueIterator.next();
mockList.add(value);
if (shouldBuildRecordOperationKey(value) || shouldRecordCallReplayMax) {
byte[] recordOperationKey = CacheKeyUtils.buildRecordOperationKey(category, recordId,
getOperationNameWithCategory(value, category));
nextSequence(recordOperationKey);
}
List<T> mockList = new ArrayList<>();
// Obtain the number of the same interfaces in recorded data
while (valueIterator.hasNext()) {
T value = valueIterator.next();
mockList.add(value);
if (shouldBuildRecordOperationKey(value) || shouldRecordCallReplayMax) {
byte[] recordOperationKey = CacheKeyUtils.buildRecordOperationKey(category, recordId,
getOperationNameWithCategory(value, category));
nextSequence(recordOperationKey);
}

for (T value : mockList) {
// Place the maximum number of playback times corresponding to the operations into the recorded data
if (shouldRecordCallReplayMax) {
byte[] recordOperationKey = CacheKeyUtils.buildRecordOperationKey(category, recordId,
value.getOperationName());
int count = resultCount(recordOperationKey);
Mocker.Target targetResponse = value.getTargetResponse();
if (targetResponse != null) {
targetResponse.setAttribute(CALL_REPLAY_MAX, count);
}
}
mockList.sort(Comparator.comparing(Mocker::getCreationTime));
for (T value : mockList) {
// Place the maximum number of playback times corresponding to the operations into the recorded data
if (shouldRecordCallReplayMax) {
byte[] recordOperationKey = CacheKeyUtils.buildRecordOperationKey(category, recordId,
value.getOperationName());
int count = resultCount(recordOperationKey);
Mocker.Target targetResponse = value.getTargetResponse();
if (targetResponse != null) {
targetResponse.setAttribute(CALL_REPLAY_MAX, count);
}
size = sequencePutRecordData(category, recordIdBytes, size, recordKey, value);
}
} else {
while (valueIterator.hasNext()) {
T value = valueIterator.next();
size = sequencePutRecordData(category, recordIdBytes, size, recordKey, value);
}
size = sequencePutRecordData(category, recordIdBytes, size, recordKey, value);
}
LOGGER.info("put record result to cache size:{} for category:{},record id:{}", size, category,
recordId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,7 @@ public Iterable<AREXMocker> queryRecordList(MockCategoryType category, String re
updateExpirationTime(Collections.singletonList(recordIdFilter), collectionSource);
}
Iterable<AREXMocker> iterable = collectionSource
.find(recordIdFilter)
.sort(CREATE_TIME_ASCENDING_SORT);
.find(recordIdFilter);
return new AttachmentCategoryIterable(category, iterable);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.arextest.storage.service;

import com.arextest.model.mock.AREXMocker;
import com.arextest.model.mock.MockCategoryType;
import com.arextest.model.mock.Mocker;
import com.arextest.storage.repository.RepositoryProvider;
import com.arextest.storage.repository.RepositoryProviderFactory;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
Expand All @@ -18,10 +21,13 @@
public class MockSourceEditionService {

private final RepositoryProviderFactory providerFactory;
private final ScheduleReplayingService scheduleReplayingService;

public MockSourceEditionService(RepositoryProviderFactory providerFactory,
ScheduleReplayingService scheduleReplayingService,
Set<MockCategoryType> entryPointTypes) {
this.providerFactory = providerFactory;
this.scheduleReplayingService = scheduleReplayingService;
}

public <T extends Mocker> boolean add(String providerName, T item) {
Expand Down Expand Up @@ -127,14 +133,14 @@ public int copyTo(String srcProviderName, String srcRecordId, String targetProvi
LOGGER.warn("could not found provider for {} or {}", srcProvider, targetProvider);
return count;
}
Iterable<Mocker> srcItemIterable;
List<Mocker> srcMockers;
Set<MockCategoryType> categoryTypes = providerFactory.getCategoryTypes();
for (MockCategoryType categoryType : categoryTypes) {
srcItemIterable = srcProvider.queryRecordList(categoryType, srcRecordId);
if (srcItemIterable == null) {
srcMockers = scheduleReplayingService.queryRecordList(srcProvider, categoryType, srcRecordId);
if (CollectionUtils.isEmpty(srcMockers)) {
continue;
}
List<Mocker> targetList = createTargetList(srcItemIterable, targetRecordId);
List<Mocker> targetList = createTargetList(srcMockers, targetRecordId);
if (CollectionUtils.isNotEmpty(targetList)) {
if (targetProvider.saveList(targetList)) {
count += targetList.size();
Expand Down Expand Up @@ -162,19 +168,17 @@ public boolean removeByRecordId(String providerName, String recordId) {
return true;
}

private List<Mocker> createTargetList(Iterable<Mocker> srcItemIterable, String targetRecordId) {
Iterator<Mocker> valueIterator = srcItemIterable.iterator();
private List<Mocker> createTargetList(List<Mocker> srcMockers, String targetRecordId) {
List<Mocker> targetList = null;
long now = System.currentTimeMillis();
while (valueIterator.hasNext()) {
for (Mocker mocker: srcMockers) {
if (targetList == null) {
targetList = new LinkedList<>();
}
Mocker value = valueIterator.next();
value.setRecordId(targetRecordId);
value.setId(null);
value.setCreationTime(now);
targetList.add(value);
mocker.setRecordId(targetRecordId);
mocker.setId(null);
mocker.setCreationTime(now);
targetList.add(mocker);
}
return targetList;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.arextest.config.repository.ConfigRepositoryProvider;
import com.arextest.model.mock.AREXMocker;
import com.arextest.model.mock.MockCategoryType;
import com.arextest.model.mock.Mocker;
import com.arextest.model.replay.PagedRequestType;
import com.arextest.model.replay.ViewRecordRequestType;
import com.arextest.model.replay.holder.ListResultHolder;
Expand All @@ -15,6 +16,7 @@
import com.arextest.storage.trace.MDCTracer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
Expand Down Expand Up @@ -96,33 +98,44 @@ public List<AREXMocker> queryEntryPointByRange(PagedRequestType requestType) {
return Collections.emptyList();
}

public List<AREXMocker> queryRecordList(ViewRecordRequestType viewRecordRequestType) {
public List<Mocker> queryRecordList(ViewRecordRequestType viewRecordRequestType) {
String sourceProvider = viewRecordRequestType.getSourceProvider();
String recordId = viewRecordRequestType.getRecordId();
RepositoryReader<AREXMocker> repositoryReader = repositoryProviderFactory.findProvider(
RepositoryProvider<Mocker> repositoryReader = repositoryProviderFactory.findProvider(
sourceProvider);
if (repositoryReader == null) {
return Collections.emptyList();
}
MockCategoryType categoryType = repositoryProviderFactory.findCategory(
viewRecordRequestType.getCategoryType());
if (categoryType != null) {
return new IterableListWrapper<>(repositoryReader.queryRecordList(categoryType, recordId));
return queryRecordList(repositoryReader, categoryType, recordId);
}
List<AREXMocker> readableResult = new LinkedList<>();
List<Mocker> readableResult = new LinkedList<>();
for (MockCategoryType category : repositoryProviderFactory.getCategoryTypes()) {
MDCTracer.addCategory(category);
Iterable<AREXMocker> recordList = repositoryReader.queryRecordList(category, recordId);
if (recordList == null) {
continue;
}
for (AREXMocker mocker : recordList) {
readableResult.add(mocker);
List<Mocker> mockers = queryRecordList(repositoryReader, category, recordId);
if (CollectionUtils.isNotEmpty(mockers)) {
readableResult.addAll(mockers);
}
}
return readableResult;
}

public List<Mocker> queryRecordList(RepositoryProvider<Mocker> repositoryReader,
MockCategoryType categoryType, String recordId) {
Iterable<? extends Mocker> iterable = repositoryReader.queryRecordList(categoryType, recordId);
if (iterable == null) {
return null;
}
List<Mocker> resultList = new LinkedList<>();
for (Mocker mocker : iterable) {
resultList.add(mocker);
}
resultList.sort(Comparator.comparing(Mocker::getCreationTime));
return resultList;
}

public long countByRange(PagedRequestType replayCaseRangeRequest) {
if (replayCaseRangeRequest.getCategory() == null) {
return countAllEntrypointCategory(replayCaseRangeRequest);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.arextest.storage.web.controller;

import com.arextest.model.mock.AREXMocker;
import com.arextest.model.mock.Mocker;
import com.arextest.model.replay.CountOperationCaseRequestType;
import com.arextest.model.replay.CountOperationCaseResponseType;
import com.arextest.model.replay.PagedRequestType;
Expand Down Expand Up @@ -239,7 +239,7 @@ public Response viewRecord(@RequestBody ViewRecordRequestType requestType) {
MDCTracer.addRecordId(recordId);
ViewRecordResponseType responseType = new ViewRecordResponseType();
try {
List<AREXMocker> allReadableResult = scheduleReplayingService.queryRecordList(requestType);
List<Mocker> allReadableResult = scheduleReplayingService.queryRecordList(requestType);
if (CollectionUtils.isEmpty(allReadableResult)) {
LOGGER.info("could not found any resources for request: {}", requestType);
}
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -403,5 +403,5 @@
<url>https://github.com/arextest/arex-storage</url>


<version>1.0.40</version>
<version>1.0.41</version>
</project>