blob: e75c2ade4bb6b8d43b70ab833b21eb8aa54a9162 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.eagle.storage.jdbc;
import org.junit.Assert;
import org.apache.commons.lang.time.StopWatch;
import org.apache.eagle.common.DateTimeUtil;
import org.apache.eagle.log.entity.meta.EntityDefinition;
import org.apache.eagle.log.entity.meta.EntityDefinitionManager;
import org.apache.eagle.log.entity.test.TestTimeSeriesAPIEntity;
import org.apache.eagle.storage.exception.QueryCompileException;
import org.apache.eagle.storage.operation.CompiledQuery;
import org.apache.eagle.storage.operation.RawQuery;
import org.apache.eagle.storage.result.ModifyResult;
import org.apache.eagle.storage.result.QueryResult;
import org.junit.Ignore;
import org.junit.Test;
import java.io.IOException;
import java.util.*;
public class TestJdbcStorage extends JdbcStorageTestBase {
EntityDefinition entityDefinition;
@Override
public void setUp() throws Exception {
entityDefinition = EntityDefinitionManager.getEntityDefinitionByEntityClass(TestTimeSeriesAPIEntity.class);
entityDefinition.setTags(new String[]{"cluster","datacenter","random"});
super.setUp();
}
@Test
public void testReadBySimpleQuery() throws QueryCompileException, IOException {
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[@cluster=\"c4ut\"]{*}");
System.out.println(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp));
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithMilliseconds(baseTimestamp+2000));
rawQuery.setPageSize(1000);
CompiledQuery query = new CompiledQuery(rawQuery);
QueryResult<TestTimeSeriesAPIEntity> result = storage.query(query, entityDefinition);
Assert.assertNotNull(result);
}
@Test
public void testReadByNotEqualCondition() throws QueryCompileException, IOException {
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[@cluster!=\"c4ut_not_found\" AND @field1 != 0]{*}");
System.out.println(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp));
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithMilliseconds(baseTimestamp+2000));
rawQuery.setPageSize(1000);
CompiledQuery query = new CompiledQuery(rawQuery);
QueryResult<TestTimeSeriesAPIEntity> result = storage.query(query, entityDefinition);
Assert.assertNotNull(result);
}
@Test
public void testReadByComplexQuery() throws QueryCompileException, IOException {
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[@cluster=\"c4ut\" AND @field4 > 1000 OR @datacenter =\"d4ut\" ]{@field1,@field2}");
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp + 2000));
rawQuery.setPageSize(1000);
CompiledQuery query = new CompiledQuery(rawQuery);
storage.query(query,entityDefinition);
}
@Test
public void testReadByComplexQueryWithLike() throws QueryCompileException, IOException {
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[@cluster=\"c4ut\" AND @field4 > 1000 AND @field7 CONTAINS \"99404f47e309\" OR @datacenter =\"d4ut\" ]{@field1,@field2}");
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(baseTimestamp + 2000));
rawQuery.setPageSize(1000);
CompiledQuery query = new CompiledQuery(rawQuery);
storage.query(query,entityDefinition);
}
@Test
public void testWrite() throws IOException {
List<TestTimeSeriesAPIEntity> entityList = new ArrayList<TestTimeSeriesAPIEntity>();
int i= 0;
while( i++ < 1000){
TestTimeSeriesAPIEntity entity = newInstance();
entityList.add(entity);
}
ModifyResult<String> result = storage.create(entityList, entityDefinition);
Assert.assertTrue(result.getSize() > 0);
}
@Test
public void testWriteAndRead() throws IOException, QueryCompileException {
// record insert init time
long startTime = System.currentTimeMillis();
// Write 1000 entities
List<TestTimeSeriesAPIEntity> entityList = new ArrayList<TestTimeSeriesAPIEntity>();
int i= 0;
while( i++ < 1000){
entityList.add(newInstance());
}
ModifyResult<String> result = storage.create(entityList, entityDefinition);
Assert.assertTrue(result.getSize() >= 1000);
// record insertion finish time
long endTime = System.currentTimeMillis();
// init read in time range [startTime, endTime)
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[]{*}");
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(startTime));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(endTime+1000));
rawQuery.setPageSize(10000);
CompiledQuery query = new CompiledQuery(rawQuery);
QueryResult queryResult = storage.query(query, entityDefinition);
Assert.assertTrue(queryResult.getSize() >= 1000);
}
@Test
public void testWriteAndAggregation() throws IOException, QueryCompileException {
// record insert init time
long startTime = System.currentTimeMillis();
// Write 1000 entities
List<TestTimeSeriesAPIEntity> entityList = new ArrayList<TestTimeSeriesAPIEntity>();
int i= 0;
while( i++ < 1000){
entityList.add(newInstance());
}
ModifyResult<String> result = storage.create(entityList, entityDefinition);
Assert.assertTrue(result.getSize() >= 1000);
// record insertion finish time
long endTime = System.currentTimeMillis();
// init read in time range [startTime, endTime)
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[]<@cluster,@datacenter>{count,max(@field1),min(@field2),sum(@field3)}");
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(startTime));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(endTime+1000));
rawQuery.setPageSize(1000000);
CompiledQuery query = new CompiledQuery(rawQuery);
QueryResult queryResult = storage.query(query, entityDefinition);
Assert.assertTrue(queryResult.getSize() >= 1);
}
@Test
public void testWriteAndDelete() throws IOException, QueryCompileException {
// record insert init time
long startTime = System.currentTimeMillis();
// Write 1000 entities
List<TestTimeSeriesAPIEntity> entityList = new ArrayList<TestTimeSeriesAPIEntity>();
int i= 0;
while( i++ < 1000){
entityList.add(newInstance());
}
ModifyResult<String> result = storage.create(entityList, entityDefinition);
Assert.assertTrue(result.getSize() >= 1000);
// record insertion finish time
long endTime = System.currentTimeMillis();
// delete in time range [startTime, endTime)
RawQuery rawQuery = new RawQuery();
rawQuery.setQuery("TestTimeSeriesAPIEntity[]{*}");
rawQuery.setStartTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(startTime-1000));
rawQuery.setEndTime(DateTimeUtil.millisecondsToHumanDateWithSeconds(endTime+1000));
rawQuery.setPageSize(1000000);
CompiledQuery query = new CompiledQuery(rawQuery);
ModifyResult<String> queryResult = storage.delete(query, entityDefinition);
Assert.assertTrue(queryResult.getSize() >= 1000);
}
@Test
public void testWriteAndUpdate() throws IOException, QueryCompileException {
// Write 1000 entities
List<TestTimeSeriesAPIEntity> entityList = new ArrayList<TestTimeSeriesAPIEntity>();
int i= 0;
while( i++ < 1000){
entityList.add(newInstance());
}
ModifyResult<String> result = storage.create(entityList, entityDefinition);
Assert.assertTrue(result.getSize() >= 1000);
// record insertion finish time
ModifyResult<String> queryResult = storage.update(entityList, entityDefinition);
Assert.assertTrue(queryResult.getSize() >= 1000);
}
/**
* TODO: Investigate why writing performance becomes slower as records count increases
*
* 1) Wrote 100000 records in about 18820 ms for empty table
* 2) Wrote 100000 records in about 35056 ms when 1M records in table
*
* @throws IOException
*/
@Test @Ignore("Ignore performance auto testing")
public void testWriterPerformance() throws IOException {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
List<TestTimeSeriesAPIEntity> entityList = new ArrayList<TestTimeSeriesAPIEntity>();
int i= 0;
while( i++ < 100000){
entityList.add(newInstance());
if(entityList.size()>=1000) {
ModifyResult<String> result = storage.create(entityList, entityDefinition);
Assert.assertNotNull(result);
entityList.clear();
}
}
stopWatch.stop();
LOG.info("Wrote 100000 records in "+stopWatch.getTime()+" ms");
}
private TestTimeSeriesAPIEntity newInstance(){
TestTimeSeriesAPIEntity instance = new TestTimeSeriesAPIEntity();
instance.setField1(123);
instance.setField2(234);
instance.setField3(1231312312l);
instance.setField4(12312312312l);
instance.setField5(123123.12312);
instance.setField6(-12312312.012);
instance.setField7(UUID.randomUUID().toString());
instance.setTags(new HashMap<String, String>() {{
put("cluster", "c4ut");
put("datacenter", "d4ut");
put("random",UUID.randomUUID().toString());
}});
instance.setTimestamp(System.currentTimeMillis());
return instance;
}
}