blob: 08e1db487f3cc95a561e917d9edb66cf398266e2 [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.polygene.index.rdf;
/**
* JAVADOC
*/
import java.io.File;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.polygene.api.association.ManyAssociation;
import org.apache.polygene.api.common.UseDefaults;
import org.apache.polygene.api.common.Visibility;
import org.apache.polygene.api.entity.EntityComposite;
import org.apache.polygene.api.identity.StringIdentity;
import org.apache.polygene.api.property.Property;
import org.apache.polygene.api.query.Query;
import org.apache.polygene.api.query.QueryExpressions;
import org.apache.polygene.api.time.SystemTime;
import org.apache.polygene.api.unitofwork.UnitOfWork;
import org.apache.polygene.bootstrap.Assembler;
import org.apache.polygene.bootstrap.AssemblyException;
import org.apache.polygene.bootstrap.ModuleAssembly;
import org.apache.polygene.index.rdf.assembly.RdfNativeSesameStoreAssembler;
import org.apache.polygene.library.fileconfig.FileConfigurationAssembler;
import org.apache.polygene.library.fileconfig.FileConfigurationOverride;
import org.apache.polygene.library.rdf.repository.NativeConfiguration;
import org.apache.polygene.spi.query.IndexExporter;
import org.apache.polygene.test.AbstractPolygeneTest;
import org.apache.polygene.test.EntityTestAssembler;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RDFPerformanceTest extends AbstractPolygeneTest
{
private static final Logger LOG = LoggerFactory.getLogger( RDFPerformanceTest.class );
@Rule
public final TemporaryFolder tmpDir = new TemporaryFolder();
public interface ExampleEntity extends EntityComposite
{
@UseDefaults
Property<String> someProperty();
ManyAssociation<ExampleEntity> manyAssoc();
}
@Override
public void assemble( ModuleAssembly module ) throws AssemblyException
{
new FileConfigurationAssembler()
.withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) )
.assemble( module );
ModuleAssembly prefModule = module.layer().module( "PrefModule" );
prefModule.entities( NativeConfiguration.class ).visibleIn( Visibility.application );
prefModule.forMixin( NativeConfiguration.class ).declareDefaults()
.tripleIndexes().set( "spoc,cspo" );
prefModule.forMixin( NativeConfiguration.class ).declareDefaults()
.dataDirectory().set( new File( tmpDir.getRoot(), "rdf-data" ).getAbsolutePath() );
new EntityTestAssembler().assemble( prefModule );
module.entities( ExampleEntity.class );
EntityTestAssembler testAss = new EntityTestAssembler();
testAss.assemble( module );
Assembler rdfAssembler = new RdfNativeSesameStoreAssembler();
rdfAssembler.assemble( module );
}
private List<ExampleEntity> doCreate( int howMany )
{
List<ExampleEntity> result = new ArrayList<ExampleEntity>( howMany );
List<ExampleEntity> entities = new ArrayList<ExampleEntity>();
for (Integer x = 0; x < howMany; ++x)
{
ExampleEntity exampleEntity = this.unitOfWorkFactory.currentUnitOfWork().newEntity( ExampleEntity.class, StringIdentity.identity( "entity" + x ) );
for (ExampleEntity entity : entities)
{
exampleEntity.manyAssoc().add( entity );
}
entities.add( exampleEntity );
if (entities.size() > 10)
entities.remove( 0 );
result.add( exampleEntity );
}
return result;
}
private void doRemoveAll( List<ExampleEntity> entities )
{
for (ExampleEntity entity : entities)
{
this.unitOfWorkFactory.currentUnitOfWork().remove( this.unitOfWorkFactory.currentUnitOfWork().get( entity ) );
}
}
private List<ExampleEntity> doList( int howMany )
{
List<ExampleEntity> list = new ArrayList<ExampleEntity>();
UnitOfWork uow = this.unitOfWorkFactory.newUnitOfWork();
Iterator<ExampleEntity> iter = uow.newQuery( this.queryBuilderFactory.newQueryBuilder( ExampleEntity.class ) ).iterator();
int found = 0;
while (iter.hasNext())
{
found++;
ExampleEntity exampleEntity = iter.next();
if (exampleEntity != null)
list.add( exampleEntity );
}
uow.discard();
if (found != howMany)
{
LOG.warn( "Found " + found + " entities instead of " + howMany + "." );
}
return list;
}
private void doRemove( int howMany )
{
Iterator<ExampleEntity> iter = this.unitOfWorkFactory.currentUnitOfWork().newQuery( this.queryBuilderFactory.newQueryBuilder( ExampleEntity.class )).maxResults( howMany ).iterator();
Integer removed = 0;
while (iter.hasNext())
{
this.unitOfWorkFactory.currentUnitOfWork().remove( iter.next() );
++removed;
}
if (removed != howMany)
{
LOG.warn( "Removed " + removed + " entities instead of " + howMany + "." );
}
}
private void performTest( int howMany ) throws Exception
{
Instant startTest = SystemTime.now();
UnitOfWork creatingUOW = this.unitOfWorkFactory.newUnitOfWork();
Instant startingTime = SystemTime.now();
List<ExampleEntity> entities = this.doCreate( howMany );
LOG.info( "Time to create " + howMany + " entities: " + Duration.between(startingTime, SystemTime.now() ) );
startingTime = SystemTime.now();
creatingUOW.complete();
LOG.info( "Time to complete creation uow: " + Duration.between(startingTime, SystemTime.now() ) );
List<ExampleEntity> entityList = this.doList( howMany );
startingTime = SystemTime.now();
UnitOfWork uow = this.unitOfWorkFactory.newUnitOfWork();
for (int i = 0; i < 1000; i++)
{
ExampleEntity entity50 = uow.get(ExampleEntity.class, StringIdentity.identity( "entity50" ) );
Query<ExampleEntity> query = uow.newQuery( this.queryBuilderFactory.newQueryBuilder( ExampleEntity.class ).
where( QueryExpressions.contains( QueryExpressions.templateFor( ExampleEntity.class ).manyAssoc(), entity50) ));
System.out.println(query.count());
}
Instant endTest = SystemTime.now();
LOG.info( "Time to query " + howMany + " entities: " + Duration.between(startTest, endTest) );
UnitOfWork deletingUOW = this.unitOfWorkFactory.newUnitOfWork();
startingTime = SystemTime.now();
this.doRemoveAll( entityList );
// this.doRemove(200);
LOG.info( "Time to delete " + howMany + " entities: " + Duration.between(startingTime, SystemTime.now() ) );
startingTime = SystemTime.now();
deletingUOW.complete();
endTest = SystemTime.now();
LOG.info( "time to complete deletion uow: " + Duration.between(startingTime, endTest ) );
LOG.info( "time to complete test: " + Duration.between(startingTime, endTest ) );
}
@Test
public void dummy()
{
// Dummy test to make Maven happy
}
// @Test
public void performanceTest200() throws Exception
{
this.performTest( 200 );
this.performTest( 200 );
this.performTest( 200 );
this.performTest( 200 );
this.performTest( 200 );
this.performTest( 200 );
this.performTest( 200 );
this.performTest( 200 );
IndexExporter indexerExporter =
serviceFinder.findService( IndexExporter.class ).get();
indexerExporter.exportReadableToStream( System.out );
}
@Ignore
@Test
public void performanceTest1000() throws Exception
{
this.performTest( 1000 );
}
@Ignore
@Test
public void performanceTest5000() throws Exception
{
this.performTest( 5000 );
}
@Ignore
@Test
public void performanceTest10000() throws Exception
{
this.performTest( 10000 );
}
@Ignore
@Test
public void performanceTest100000() throws Exception
{
this.performTest( 100000 );
}
}