Add adjacent data to FullDataDTO for faster loading
This commit is contained in:
@@ -22,8 +22,10 @@ package tests;
|
||||
import com.seibel.distanthorizons.api.enums.config.EDhApiDataCompressionMode;
|
||||
import com.seibel.distanthorizons.core.dataObjects.fullData.FullDataPointIdMap;
|
||||
import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2;
|
||||
import com.seibel.distanthorizons.core.enums.EDhDirection;
|
||||
import com.seibel.distanthorizons.core.pos.DhSectionPos;
|
||||
import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO;
|
||||
import com.seibel.distanthorizons.core.sql.dto.util.FullDataMinMaxPosUtil;
|
||||
import com.seibel.distanthorizons.core.sql.repo.FullDataSourceV2Repo;
|
||||
import com.seibel.distanthorizons.core.util.FullDataPointUtil;
|
||||
import com.seibel.distanthorizons.core.util.LodUtil;
|
||||
@@ -37,6 +39,7 @@ import org.junit.Test;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
@@ -78,12 +81,17 @@ public class DhFullDataSourceRepoTests
|
||||
long pos = DhSectionPos.encode((byte)6, 1, 2);
|
||||
FullDataPointIdMap dataMapping = new FullDataPointIdMap(pos);
|
||||
LongArrayList[] fullDataArray = new LongArrayList[FullDataSourceV2.WIDTH * FullDataSourceV2.WIDTH];
|
||||
|
||||
|
||||
Random seededRandom = new Random(3);
|
||||
|
||||
for (int i = 0; i < FullDataSourceV2.WIDTH * FullDataSourceV2.WIDTH; i++)
|
||||
{
|
||||
fullDataArray[i] = new LongArrayList(1);
|
||||
|
||||
for (int j = 0; j < 32; j++)
|
||||
// random column heights so we can differentiate
|
||||
// columns from each other
|
||||
int columnCount = Math.abs(seededRandom.nextInt() % 31) + 1;
|
||||
for (int j = 0; j < columnCount; j++)
|
||||
{
|
||||
fullDataArray[i].add(FullDataPointUtil.encode(j, 1, j, LodUtil.MAX_MC_LIGHT, LodUtil.MAX_MC_LIGHT));
|
||||
}
|
||||
@@ -103,9 +111,10 @@ public class DhFullDataSourceRepoTests
|
||||
|
||||
|
||||
|
||||
//=========================//
|
||||
// assert DTO data is the same //
|
||||
//=========================//
|
||||
//=======================//
|
||||
// confirm DTO data is //
|
||||
// the same after saving //
|
||||
//=======================//
|
||||
|
||||
FullDataSourceV2DTO savedDto = repo.getByKey(pos);
|
||||
|
||||
@@ -115,22 +124,104 @@ public class DhFullDataSourceRepoTests
|
||||
assertArraysAreEqual(originalDto.compressedColumnGenStepByteArray, savedDto.compressedColumnGenStepByteArray);
|
||||
assertArraysAreEqual(originalDto.compressedWorldCompressionModeByteArray, savedDto.compressedWorldCompressionModeByteArray);
|
||||
|
||||
assertArraysAreEqual(originalDto.compressedNorthAdjDataByteArray, savedDto.compressedNorthAdjDataByteArray);
|
||||
assertArraysAreEqual(originalDto.compressedSouthAdjDataByteArray, savedDto.compressedSouthAdjDataByteArray);
|
||||
assertArraysAreEqual(originalDto.compressedEastAdjDataByteArray, savedDto.compressedEastAdjDataByteArray);
|
||||
assertArraysAreEqual(originalDto.compressedWestAdjDataByteArray, savedDto.compressedWestAdjDataByteArray);
|
||||
|
||||
|
||||
//====================================//
|
||||
// assert dataSource data is the same //
|
||||
//====================================//
|
||||
|
||||
FullDataSourceV2 savedDataSource = savedDto.createUnitTestDataSource();
|
||||
//========================//
|
||||
// confirm data source is //
|
||||
// the same after saving //
|
||||
//========================//
|
||||
|
||||
Assert.assertNotNull("Failed to create DataSource", savedDataSource);
|
||||
Assert.assertEquals("Pos mismatch", originalDataSource.getPos(), savedDataSource.getPos());
|
||||
assertArraysAreEqual(originalDataSource.columnGenerationSteps, savedDataSource.columnGenerationSteps);
|
||||
assertArraysAreEqual(originalDataSource.columnWorldCompressionMode, savedDataSource.columnWorldCompressionMode);
|
||||
Assert.assertTrue(originalDataSource.dataPoints.length == savedDataSource.dataPoints.length);
|
||||
for (int i = 0; i < FullDataSourceV2.WIDTH*FullDataSourceV2.WIDTH; i++)
|
||||
try (FullDataSourceV2 savedDataSource = savedDto.createUnitTestDataSource())
|
||||
{
|
||||
assertArraysAreEqual(originalDataSource.dataPoints[i], savedDataSource.dataPoints[i]);
|
||||
Assert.assertNotNull("Failed to create DataSource", savedDataSource);
|
||||
Assert.assertEquals("Pos mismatch", originalDataSource.getPos(), savedDataSource.getPos());
|
||||
assertArraysAreEqual(originalDataSource.columnGenerationSteps, savedDataSource.columnGenerationSteps);
|
||||
assertArraysAreEqual(originalDataSource.columnWorldCompressionMode, savedDataSource.columnWorldCompressionMode);
|
||||
Assert.assertEquals(originalDataSource.dataPoints.length, savedDataSource.dataPoints.length);
|
||||
for (int i = 0; i < FullDataSourceV2.WIDTH * FullDataSourceV2.WIDTH; i++)
|
||||
{
|
||||
assertArraysAreEqual(originalDataSource.dataPoints[i], savedDataSource.dataPoints[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//==============//
|
||||
// adjacent DTO //
|
||||
//==============//
|
||||
|
||||
try (FullDataSourceV2DTO adjDto = repo.getAdjByPosAndDirection(pos, EDhDirection.NORTH))
|
||||
{
|
||||
assertArraysAreEqual(adjDto.compressedDataByteArray, savedDto.compressedNorthAdjDataByteArray);
|
||||
}
|
||||
|
||||
try (FullDataSourceV2DTO adjDto = repo.getAdjByPosAndDirection(pos, EDhDirection.SOUTH))
|
||||
{
|
||||
assertArraysAreEqual(adjDto.compressedDataByteArray, savedDto.compressedSouthAdjDataByteArray);
|
||||
}
|
||||
|
||||
try (FullDataSourceV2DTO adjDto = repo.getAdjByPosAndDirection(pos, EDhDirection.EAST))
|
||||
{
|
||||
assertArraysAreEqual(adjDto.compressedDataByteArray, savedDto.compressedEastAdjDataByteArray);
|
||||
}
|
||||
|
||||
try (FullDataSourceV2DTO adjDto = repo.getAdjByPosAndDirection(pos, EDhDirection.WEST))
|
||||
{
|
||||
assertArraysAreEqual(adjDto.compressedDataByteArray, savedDto.compressedWestAdjDataByteArray);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//======================//
|
||||
// adjacent datasources //
|
||||
//======================//
|
||||
|
||||
for (EDhDirection direction : EDhDirection.CARDINAL_COMPASS)
|
||||
{
|
||||
try (FullDataSourceV2DTO adjDto = repo.getAdjByPosAndDirection(pos, direction);
|
||||
FullDataSourceV2 adjSource = adjDto.createUnitTestDataSource(direction))
|
||||
{
|
||||
long encodedMinMaxPos = FullDataMinMaxPosUtil.getEncodedMinMaxPos(direction);
|
||||
int minX = FullDataMinMaxPosUtil.getAdjMinX(encodedMinMaxPos);
|
||||
int maxX = FullDataMinMaxPosUtil.getAdjMaxX(encodedMinMaxPos);
|
||||
int minZ = FullDataMinMaxPosUtil.getAdjMinZ(encodedMinMaxPos);
|
||||
int maxZ = FullDataMinMaxPosUtil.getAdjMaxZ(encodedMinMaxPos);
|
||||
|
||||
for (int x = minX; x < maxX; x++)
|
||||
{
|
||||
for (int z = minZ; z < maxZ; z++)
|
||||
{
|
||||
int index = FullDataSourceV2.relativePosToIndex(x, z);
|
||||
LongArrayList adjDataColumn = adjSource.dataPoints[index];
|
||||
LongArrayList originalDataColumn = originalDataSource.dataPoints[index];
|
||||
|
||||
assertArraysAreEqual(adjDataColumn, originalDataColumn);
|
||||
}
|
||||
}
|
||||
|
||||
for (int x = 0; x < FullDataSourceV2.WIDTH; x++)
|
||||
{
|
||||
for (int z = 0; z < FullDataSourceV2.WIDTH; z++)
|
||||
{
|
||||
if (x >= minX && x < maxX
|
||||
&& z >= minZ && z < maxZ)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
int index = FullDataSourceV2.relativePosToIndex(x, z);
|
||||
LongArrayList adjDataColumn = adjSource.dataPoints[index];
|
||||
Assert.assertEquals(1, adjDataColumn.size());
|
||||
Assert.assertEquals(FullDataPointUtil.EMPTY_DATA_POINT, adjDataColumn.getLong(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of the Distant Horizons mod
|
||||
* licensed under the GNU LGPL v3 License.
|
||||
*
|
||||
* Copyright (C) 2020 James Seibel
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package tests;
|
||||
|
||||
import com.seibel.distanthorizons.core.sql.dto.util.FullDataMinMaxPosUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class FullDataMinMaxPosTest
|
||||
{
|
||||
|
||||
@Test
|
||||
public void EncodeAdjacentMinMaxPosTest()
|
||||
{
|
||||
int maxTest = 3;
|
||||
for (short minX = 0; minX < maxTest; minX++)
|
||||
{
|
||||
for (short maxX = 0; maxX < maxTest; maxX++)
|
||||
{
|
||||
for (short minZ = 0; minZ < maxTest; minZ++)
|
||||
{
|
||||
for (short maxZ = 0; maxZ < maxTest; maxZ++)
|
||||
{
|
||||
long encodedPos = FullDataMinMaxPosUtil.encodeAdjMinMaxPos(minX, maxX, minZ, maxZ);
|
||||
|
||||
Assert.assertEquals(minX, FullDataMinMaxPosUtil.getAdjMinX(encodedPos));
|
||||
Assert.assertEquals(maxX, FullDataMinMaxPosUtil.getAdjMaxX(encodedPos));
|
||||
Assert.assertEquals(minZ, FullDataMinMaxPosUtil.getAdjMinZ(encodedPos));
|
||||
Assert.assertEquals(maxZ, FullDataMinMaxPosUtil.getAdjMaxZ(encodedPos));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user