Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("path", "to", "storage"));Frequently Asked Questions - Answered
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://host:3306/mydb");
dataSource.setUser("user");
dataSource.setPassword("secret");
SqlFileSystem fileSystem = SqlFileSystem.New(
SqlConnector.Caching(
SqlProviderMySql.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.32.3</version>
</dependency>SQLiteDataSource dataSource = new SQLiteDataSource();
dataSource.setUrl("jdbc:sqlite:microstreamdb");
SqlFileSystem fileSystem = SqlFileSystem.New(
SqlConnector.Caching(
SqlProviderSqlite.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.oraclecloud</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>ObjectStorageClient client = ...;
BlobStoreFileSystem fileSystem = BlobStoreFileSystem.New(
OracleCloudObjectStorageConnector.Caching(client)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.oraclenosql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>KVStore kvstore = KVStoreFactory.getStore(
new KVStoreConfig("kvstore", "kvlite:5000")
);
BlobStoreFileSystem fileSystem = BlobStoreFileSystem.New(
OracleNoSqlConnector.Caching(kvstore)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.coherence</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>NamedCache cache = CacheFactory.getCache("cache-name");
BlobStoreFileSystem fileSystem = BlobStoreFileSystem.New(
CoherenceConnector.Caching(cache)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));public class User
{
private String username;
//do not persist the users password
private transient String password;
}PersistenceFieldEvaluator fieldEvaluator =
(clazz, field) -> !field.getName().startsWith("_");
EmbeddedStorageManager storage = EmbeddedStorage.Foundation()
.onConnectionFoundation(
c -> c.setFieldEvaluatorPersistable(fieldEvaluator)
)
.createEmbeddedStorageManager()
.start();EmbeddedStorageManager storage = EmbeddedStorage.start();root.MyArrayList.remove(0);
storage.store(root.MyArrayList);public List<Article> getUnAvailableArticles()
{
return shop.getArticles().stream()
.filter(a -> !a.available())
.collect(Collectors.toList())
;
}EmbeddedStorageManager storage = EmbeddedStorage.Foundation(Paths.get("mydb"))
.onConnectionFoundation(cf ->
cf.setClassLoaderProvider(ClassLoaderProvider.New(myClassLoader))
)
.start();public class CustomEagerStoringFieldEvaluator
implements PersistenceEagerStoringFieldEvaluator
{
@Override
public boolean isEagerStoring(Class<?> clazz, Field field)
{
if(clazz == MyClass.class && field.getName().equals("eagerField")
{
return true;
}
return false;
}
}Persister fields can be customized via PersistenceFoundation#setFieldEvaluatorPersister.
Note, however, that the check for compatibility with the Persister type is done in any case to avoid inconsistencies/crashes.class MyEntity
{
String name ;
int value;
transient EmbeddedStorageManager storage;
}final EmbeddedStorageManager storage = EmbeddedStorage.start();
if(storage.root() == null)
{
//No existing Database found
}
else
{
MyRoot root = (MyRoot) storage.root();
}EmbeddedStorageManager storage = EmbeddedStorage.Foundation(Paths.get("mydb"))
.onConnectionFoundation(cf ->
cf.setClassLoaderProvider(typeName -> {
if(typeName.startsWith("com.company.module1."))
{
return module1ClassLoader;
}
if(typeName.startsWith("com.company.module2."))
{
return module2ClassLoader;
}
return ClassLoader.getSystemClassLoader();
})
)
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(Paths.get("mydb"))
.onConnectionFoundation(cf ->
cf.setClassLoaderProvider(ClassLoaderProvider.New(
Thread.currentThread().getContextClassLoader()
))
)
.start();NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage
.Foundation(fileSystem.ensureDirectoryPath(WORKINGDIR))
.onConnectionFoundation(f ->
{
f.setReferenceFieldEagerEvaluator(new CustomEagerStoringFieldEvaluator());
})
.start(ROOT)
;<dependency>
<groupId>one.microstream</groupId>
<artifactId>jigsaw</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>EmbeddedStorageManager storageManager = EmbeddedStorage
.Foundation()
.setLockFileSetupProvider(Storage.LockFileSetupProvider())
.start();List subset = myCollection.getSubset();
subset.foreach(item -> item.modify());
storage.storeAll(subset);storage.storeAll(itemA, iteamB, iteamC);Storer storer = storage.createEagerStorer();
storer.store(myData);
storer.commit();LazyReferenceManager.set(LazyReferenceManager.New(
Lazy.Checker(
Duration.ofMinutes(30).toMillis(), // timeout of lazy access
0.75 // memory quota
)
);EmbeddedStorageManager storageManager = Configuration.Default()
<properties>
<property name="backupDirectory" value ="/save/backup" />
...
</properties>backupDirectory = backupDir
NioFileSystem fileSystem = NioFileSystem.New();
StorageBackupSetup backupSetup = StorageBackupSetup.New(
Storage.BackupFileProviderBuilder(fileSystem)
.setDirectory(fileSystem.ensureDirectoryPath(BACKUPDIR))
.setTruncationDirectory(fileSystem.ensureDirectoryPath(TRUNCATIONDIR))
.setDeletionDirectory(fileSystem.ensureDirectoryPath(DELETIONDIR))
.createFileProvider()
);
StorageConfiguration configuration = StorageConfiguration.Builder()
.setBackupSetup(backupSetup)
.setStorageFileProvider(StorageLiveFileProvider.New(
fileSystem.ensureDirectoryPath(WORKINGDIR)
))
.createConfiguration()
;EmbeddedStorage.start(Paths.get("path", "to", "storage"));NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("path", "to", "storage"));<!-- sql file system -->
<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<!-- driver of your choice -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
// create JDBC data source
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://host:3306/mydb");
dataSource.setUser("user");
dataSource.setPassword("secret");
// create sql file system
SqlFileSystem fileSystem = SqlFileSystem.New(
// use caching connector
SqlConnector.Caching(
SqlProviderMySql.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("path", "to", "storage"));
<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.restservice.sparkjava</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>EmbeddedStorageManager storage = EmbeddedStorage.start();
if(storage.root() == null)
{
storage.setRoot(new Object[] {
LocalDate.now(),
X.List("a", "b", "c"),
1337
});
storage.storeRoot();
}
StorageRestService service = StorageRestServiceResolver.resolve(storage);
service.start();<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.restclient.app</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>java -jar storage.restclient.app-04.00.00-MS-GA.jar --port=80CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Builder(Integer.class, String.class)
.storeByValue()
.expiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE))
.build();
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);
cache.put(1, "Hello World");
String value = cache.get(1); CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Load("cache-config.properties", Integer.class, String.class);PersonUpdater.New(mike)
.firstName("Jim")
.lastName("Hope")
.update();PersonUpdater.setFirstName(mike, "Jim");@SpringBootApplication
@EnableCaching
public class MyApplicationEntityVersionContext<Long> versionContext =
EntityVersionContext.AutoIncrementingLong();
JulLogger logger = new JulLogger();
Person john = PersonCreator.New()
.addLayer(versionContext)
.addLayer(logger)
.firstName("John")
.lastName("Doe")
.create();StorageFileNameProvider fileNameProvider = StorageFileNameProvider.Builder()
.setChannelDirectoryPrefix("canal_")
.setDataFilePrefix ("canal_")
.setDataFileSuffix (".bin")
.setTransactionsFilePrefix("events_")
.setTransactionsFileSuffix(".bin")
.setTypeDictionaryFileName("typeDictionary.txt")
.createFileNameProvider ()
;
NioFileSystem fileSystem = NioFileSystem.New();
StorageLiveFileProvider fileProvider = Storage
.FileProviderBuilder (fileSystem)
.setDirectory (fileSystem.ensureDirectoryPath(WORKINGDIR))
.setDeletionDirectory (fileSystem.ensureDirectoryPath(DELETIONDIR))
.setTruncationDirectory(fileSystem.ensureDirectoryPath(TRUNCATIONDIR))
.setFileNameProvider (fileNameProvider)
.createFileProvider ()
;// Add a new data object to the list in root
MyData dataItem = new MyData("Alice");
root.myObjects.add(dataItem);
// Store the modified list
storageManager.store(root.myObjects);// Modify a value type memeber and store it
dataItem.setIntValue(100);
storageManager.store(dataItem);// Change a string object and store it
dataItem.setName("Bob");
storageManager.store(dataItem);EmbeddedStorageManager storage = EmbeddedStorage.Foundation()
.onConnectionFoundation(
f -> f.setReferenceFieldEagerEvaluator(
new CustomEagerStoringFieldEvaluator()
)
)
.start();StorageRestServiceSparkJava service = StorageRestServiceSparkJava.New(storage);
service.setSparkService(
Service.ignite().port(80)
);
service.setInstanceName("my-name");<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>cache</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>...</version>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>@Component
public class CachingSetup implements JCacheManagerCustomizer
{
@Override
public void customize(CacheManager cacheManager)
{
cacheManager.createCache("my_cache", new MutableConfiguration<>()
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(SECONDS, 10000)))
.setStoreByValue(true)
.setStatisticsEnabled(true));
}
}<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>cache</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
MutableConfiguration<Integer, String> configuration = new MutableConfiguration<>()
.setTypes(Integer.class, String.class)
.setStoreByValue(false)
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE));
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);
cache.put(1, "Hello World");
String value = cache.get(1); EmbeddedStorageManager storageManager = EmbeddedStorage.start();
CachingProvider provider = (one.microstream.cache.CachingProvider)Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Builder(Integer.class, String.class, "jCache", storageManager)
.expiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_HOUR))
.build();
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);
cache.put(1, "one");
String value = cache.get(1); <repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded.configuration</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>// Initialize a storage manager ("the database") with purely defaults.
final EmbeddedStorageManager storageManager = EmbeddedStorage.start();
// print the last loaded root instance,
// replace it with a current version and store it
System.out.println(storageManager.root());
storageManager.setRoot("Hello World! @ " + new Date());
storageManager.storeRoot();
// shutdown storage
storageManager.shutdown();public class DataRoot
{
private String content;
public DataRoot()
{
super();
}
public String getContent()
{
return this.content;
}
public void setContent(final String content)
{
this.content = content;
}
@Override
public String toString()
{
return "Root: " + this.content;
}
}EmbeddedStorageManager storageManager = EmbeddedStorage.start(
myRoot, // root object of entity graph
Paths.get("data-dir") // storage data directory
);NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storageManager = EmbeddedStorageFoundation.New()
.setConfiguration(
StorageConfiguration.Builder()
.setStorageFileProvider(
Storage.FileProviderBuilder(fileSystem)
.setDirectory(fileSystem.ensureDirectoryPath("storageDir"))
.createFileProvider()
)
.setChannelCountProvider(StorageChannelCountProvider.New(4))
.setBackupSetup(StorageBackupSetup.New(
fileSystem.ensureDirectoryPath("backupDir")
))
.createConfiguration()
)
.createEmbeddedStorageManager();<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>storage.embedded.configuration</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>public class MyBusinessApp
{
// ...
private HashMap<Integer, BusinessYear> businessYears = new HashMap<>();
// ...
}public class BusinessYear
{
// ...
private ArrayList<Turnover> turnovers = new ArrayList<>();
// ...
}EmbeddedStorageManager storageManager = EmbeddedStorage.start();
CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfiguration<Integer, String> configuration = CacheConfiguration
.Builder(Integer.class, String.class, "my-cache", storageManager)
.build();
Cache<Integer, String> cache = cacheManager.createCache("jCache", configuration);keyType = java.lang.Integer
valueType = java.lang.String
readThrough = true
writeThrough = true
storageConfigurationResourceName = microstream-storage.propertiesbaseDirectory = ~/cache-data
channelCount = 4keyType = java.lang.Integer
valueType = java.lang.String
readThrough = true
writeThrough = true
storage.baseDirectory = ~/cache-data
storage.channelCount = 4public interface Person extends Entity
{
public String firstName();
public String lastName();
}Person john = PersonCreator.New()
.firstName("John")
.lastName("Doe")
.create();public class JulLogger implements EntityLogger
{
@Override
public void afterUpdate(
final Entity identity,
final Entity data,
final boolean successful)
{
Logger.getLogger(identity.getClass().getName())
.info("Entity updated");
}
}<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>base</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<annotationProcessors>
<annotationProcessor>one.microstream.wrapping.codegen.WrapperProcessor</annotationProcessor>
</annotationProcessors>
<compilerArgs>
<arg>-Amicrostream.wrapper.types=one.microstream.persistence.types.PersistenceStoring</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
@GenerateWrapper
public interface MyInterface
{
public void doStuff();
public String getStuff();
}<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>base</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<annotationProcessors>
<annotationProcessor>one.microstream.entity.codegen.EntityProcessor</annotationProcessor>
</annotationProcessors>
<compilerArgs>
<arg>-Amicrostream.entity.hashequalator=true</arg>
<arg>-Amicrostream.entity.appendable=true</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>

JulLogger logger = new JulLogger();
Person john = PersonCreator.New()
.addLayer(logger)
.firstName("John")
.lastName("Doe")
.create();@GenerateWrapperFor("one.microstream.persistence.types.PersistenceStoring")
public class WrapperGenerationDummy
{
}// Application-specific root instance
final DataRoot root = new DataRoot();
// Initialize a storage manager ("the database") with the given directory.
final EmbeddedStorageManager storageManager = EmbeddedStorage.start(
root, // root object
Paths.get("data") // storage directory
);// Set content data to the root element, including the time to visualize
// changes on the next execution.
root.setContent("Hello World! @ " + new Date());
// Store the modified root and its content.
storageManager.storeRoot();storageManager.shutdown();EmbeddedStorageManager storageManager = Configuration.Default()
.setBaseDirectoryInUserHome("data-dir")
.setBackupDirectory("backup-dir")
.setChannelCount(4)
.createEmbeddedStorageFoundation()
.createEmbeddedStorageManager();Configuration configuration = Configuration.LoadXml(
HelloWorld.class.getResource("/META-INF/microstream/storage.xml")
);<?xml version="1.0" encoding="UTF-8"?>
<properties>
<property name="baseDirectory" value ="data" />
<property name="channelCount" value ="4" />
</properties>Configuration configuration = Configuration.LoadIni(
HelloWorld.class.getResource("/META-INF/microstream/storage.ini")
);baseDirectory = data
channelCount = 4
EmbeddedStorageManager storageManager = Configuration.Default()
.setChannelCount(4)
.setChannelDirectoryPrefix("channel_")
.setDataFilePrefix("channel_")
.setDataFileSuffix(".bin")
.createEmbeddedStorageFoundation()
.createEmbeddedStorageManager();
<properties>
<property name="channelCount" value="4" />
<property name="channelDirectoryPrefix" value="channel_" />
<property name="dataFilePrefix value="channel_" />
<property name="dataFileSuffix" value=".dat" />
</properties>channelCount = 4
channelDirectoryPrefix = prefix
dataFilePrefix = channel_
dataFileSuffix = .datNioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setChannelCountProvider(Storage.ChannelCountProvider(4))
.setStorageFileProvider(
StorageLiveFileProvider.Builder()
.setDirectory(fileSystem.ensureDirectoryPath("storage"))
.createFileProvider()
)
.createConfiguration()
)
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setHousekeepingController(Storage.HousekeepingController(1000, 10_000_000))
.createConfiguration())
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setDataFileEvaluator(Storage.DataFileEvaluator(1024*1024, 1024*1024*8, 0.75))
.createConfiguration())
.start();EmbeddedStorageManager storage = EmbeddedStorage.Foundation(
Storage.ConfigurationBuilder()
.setEntityCacheEvaluator(Storage.EntityCacheEvaluator(
86_400_000,
1_000_000_000))
.createConfiguration())
.start();public class BusinessYear
{
// ...
private Lazy<ArrayList<Turnover>> turnovers = ...; // we will get to that
// ...
}ArrayList<Turnover> turnovers = this.turnovers.get();private Lazy<ArrayList<Turnover>> turnovers = Lazy.Reference(new ArrayList<>());private Lazy<ArrayList<Turnover>> turnovers = Lazy.Reference(null);private Lazy<ArrayList<Turnover>> turnovers = null;return this.turnovers == null ? null : this.turnovers.get();return Lazy.get(this.turnovers);@Lazy
private ArrayList<Turnover> turnovers = new ArrayList<>();public class Employee
{
/*
* Fields with primitive data are (for whatever reason, e.g. project
* design rules) all object types, but records should be stored as
* efficient as possible, i.e. without overhead of references and value objects.
*
* MicroStream's generic type analysis does not know of this and hence cannot
* do it. But defining a custom type handler can
*/
String id ;
Double salary ;
Date dateOfBirth;
// constructor, getters, setters, etc
/*
* The entity class must just contain "any" method returning a suitable type
* handler and MicroStream will recognize it and use the returned handler
* automatically.
*
* Type type handler just needs to specify the entity class and define a list
* of fields comprised of (name, getter, setter) in arbitrary order.
*/
static BinaryTypeHandler<Employee> provideTypeHandler()
{
return Binary.TypeHandler(
Employee.class,
Binary.Field_long("id",
e -> Long.parseLong(e.id),
(e, value) -> e.id = String.valueOf(value)
),
Binary.Field_long("dateOfBirth",
e -> e.dateOfBirth.getTime(),
(e, value) -> e.dateOfBirth = new Date(value)
),
Binary.Field_double("salary",
e -> e.salary.longValue(),
(e, value) -> e.salary = Double.valueOf(value)
)
);
}
}spring.jpa.properties.hibernate.cache.microstream.missing_cache_strategy = create
spring.jpa.properties.hibernate.cache.microstream.readThrough = true
spring.jpa.properties.hibernate.cache.microstreamwriteThrough = true
spring.jpa.properties.hibernate.cache.microstream.storage.baseDirectory = ~/cache-data
spring.jpa.properties.hibernate.cache.microstream.storage.channelCount = 4
spring.jpa.properties.hibernate.cache.region.factory_class = one.microstream.cache.hibernate.CacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache = true
spring.jpa.properties.hibernate.cache.use_second_level_cache = truespring:
jpa:
properties:
hibernate:
cache:
microstream:
missing_cache_strategy: create
readThrough: true
writeThrough: true
storage:
baseDirectory: ~/cache-data
channelCount: 4
region:
factory_class: one.microstream.cache.hibernate.CacheRegionFactory
use_query_cache: true
use_second_level_cache: truePersonUpdater.setLastName(john, "Smith");Oct 15, 2019 11:17:53 AM JulLogger afterUpdate
INFO: Entity updatedspring.jpa.properties.hibernate.cache.microstream.missing_cache_strategy=create
spring.jpa.properties.hibernate.cache.region.factory_class=one.microstream.cache.hibernate.CacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.javax.persistence.sharedCache.mode=ALLspring:
jpa:
properties:
hibernate:
cache:
microstream:
missing_cache_strategy: create
region:
factory_class: one.microstream.cache.hibernate.CacheRegionFactory
use_query_cache: true
use_second_level_cache: true
javax:
persistence:
sharedCache:
mode: ALL<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>cache.hibernate</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies><?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="...">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
...
<properties>
...
<property name="hibernate.cache.region.factory_class"
value="one.microstream.cache.hibernate.CacheRegionFactory" />
...
</properties>
</persistence-unit>
</persistence>// Start the database manager
EmbeddedStorageManager storageManager = EmbeddedStorage.start();
// Set the entity (graph) as root
storageManager.setRoot("Hello World");
// Store root
storageManager.storeRoot();// Empty application-specific root, to be filled during start()
MyApplicationRoot root = new MyApplicationRoot();
// Start the database manager
EmbeddedStorageManager storage = EmbeddedStorage.start();
// root must be filled at this point... but how?
root.printAllMyEntities();// Empty application-specific root, to be filled during start()
MyApplicationRoot root = new MyApplicationRoot();
// Start the database manager with a reference to the application's root.
EmbeddedStorageManager storageManager = EmbeddedStorage.start(root);
// root is "magically" filled at this point. (Yay!)
root.printAllMyEntities();storageManager.defaultRoot();
storageManager.customRoot();{
"objectId": "1000000000000000028",
"typeId": "110",
"length": "0",
"variableLength": [
"3"
],
"simplified": false,
"data": [
[
"1000000000000000029",
"1000000000000000030",
"1000000000000000031"
]
],
"references": null
}No entity found for objectId 1000000000000000123[Type dictionary contents]{
"creationTime": "2020-04-15T13:32:26.003Z",
"channelStatistics": {
"0": {
"channelIndex": 0,
"files": [
{
"fileNumber": "1",
"file": "storage\\channel_0\\channel_0_1.dat",
"fileCount": "1",
"liveDataLength": "2898",
"totalDataLength": "2930"
}
],
"fileCount": "1",
"liveDataLength": "2898",
"totalDataLength": "2930"
}
},
"fileCount": "1",
"liveDataLength": "2898",
"totalDataLength": "2930"
}{
name: "ROOT",
objectId: "1000000000000000028"
}EntityVersionContext<Long> versionContext =
EntityVersionContext.AutoIncrementingLong();
Person john = PersonCreator.New()
.addLayer(versionContext)
.firstName("John")
.lastName("Doe")
.create();PersonUpdater.setLastName(john, "Smith");
PersonUpdater.setLastName(john, "Archer");
PersonUpdater.setLastName(john, "Bennett");john.lastName() // now returns "Bennett"versionContext.versions(john).get(1L); // -> "John Smith"EntityVersionCleaner<Long> versionCleaner =
EntityVersionCleaner.AmountPreserving(10);
EntityVersionContext<Long> versionContext =
EntityVersionContext.AutoIncrementingLong(cleaner);EntityVersionContext<Long> systemTimeContext =
EntityVersionContext.AutoIncrementingSystemTimeMillis();
EntityVersionContext<Long> nanoTimeContext =
EntityVersionContext.AutoIncrementingSystemNanoTime();
EntityVersionContext<Instant> instantContext =
EntityVersionContext.AutoIncrementingInstant();EntityVersionCleaner<Instant> cleaner =
EntityVersionCleaner.AgePreservingInstant(Duration.of(1, ChronoUnit.YEARS));
EntityVersionContext<Instant> context =
EntityVersionContext.AutoIncrementingInstant(cleaner);EntityVersionContext.Mutable<String> versionContext =
EntityVersionContext.Mutable();
versionContext.currentVersion("rev-1");
Person john = PersonCreator.New()
.addLayer(versionContext)
.firstName("John")
.lastName("Doe")
.create();
versionContext.currentVersion("rev-2");
PersonUpdater.setLastName(john, "Smith");
versionContext.currentVersion("rev-3");
PersonUpdater.setLastName(john, "Archer");
versionContext.currentVersion("rev-4");
PersonUpdater.setLastName(john, "Bennett");String firstName = john.firstName(); // -> John
String lastName = john.lastName(); // -> Doe Person mike = PersonCreator.New(john) // use John as template
.firstName("Mike")
.create();NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
String fileSuffix = "bin";
StorageConnection connection = storage.createConnection();
StorageEntityTypeExportStatistics exportResult = connection.exportTypes(
new StorageEntityTypeExportFileProvider.Default(
fileSystem.ensureDirectoryPath("export-dir"),
fileSuffix
),
typeHandler -> true // export all, customize if necessary
);
XSequence<Path> exportFiles = CQL
.from(exportResult.typeStatistics().values())
.project(s -> Paths.get(s.file().identifier()))
.execute()
;NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
StorageConnection connection = storage.createConnection();
connection.importFiles(X.Enum(
fileSystem.ensureFilePath("type1.bin"),
fileSystem.ensureFilePath("type2.bin")
));NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
StorageDataConverterTypeBinaryToCsv converter =
new StorageDataConverterTypeBinaryToCsv.UTF8(
StorageDataConverterCsvConfiguration.defaultConfiguration(),
new StorageEntityTypeConversionFileProvider.Default(
fileSystem.ensureDirectoryPath("csv-dir"),
"csv"
),
storage.typeDictionary(),
null, // no type name mapping
4096, // read buffer size
4096 // write buffer size
);
AReadableFile dataFile = fileSystem.ensureFilePath("type1.bin").useReading();
try
{
converter.convertDataFile(dataFile);
}
finally
{
dataFile.close();
}NioFileSystem fileSystem = NioFileSystem.New();
EmbeddedStorageManager storage = EmbeddedStorage.start(
fileSystem.ensureDirectoryPath("storage")
);
StorageDataConverterTypeCsvToBinary<AFile> converter =
StorageDataConverterTypeCsvToBinary.New(
StorageDataConverterCsvConfiguration.defaultConfiguration(),
storage.typeDictionary(),
new StorageEntityTypeConversionFileProvider.Default(
fileSystem.ensureDirectoryPath("bin-dir"),
"dat"
)
);
converter.convertCsv(fileSystem.ensureFilePath("type1.csv"));EmbeddedStorageFoundation<?> foundation =
EmbeddedStorage.Foundation(); // or from somewhere else



.store() call returns, it is guaranteed that the data stored by it has been physically written to the underlying storage layer, usually a file system. Before that, there is no guarantee regarding written data at all. In fact, should the process die before the last byte has been written and secured, the next StorageManager initialization will recognize that and truncate the last partially written store. Either way, all the data that was guaranteed to be written will be consistently available after the next .start().public interface PersistenceStoring
{
public long store(Object instance);
public long[] storeAll(Object... instances);
public void storeAll(Iterable<?> instances);
public void storeSelfStoring(SelfStoring storing);
}public class PersistenceStoringWithLogging
extends Wrapper.Abstract<PersistenceStoring>
implements WrapperPersistenceStoring
{
public PersistenceStoringWithLogging(final PersistenceStoring wrapped)
{
super(wrapped);
}
@Override
public long store(Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return WrapperPersistenceStoring.super.store(instance);
}
}EmbeddedStorageConnectionFoundation f = foundation.getConnectionFoundation();foundation.onConnectionFoundation(f ->
{
...
});f.setLegacyTypeMappingResultor(...);PersistenceLegacyTypeMappingResultor.New()PrintingLegacyTypeMappingResultor.New(PersistenceLegacyTypeMappingResultor.New())InquiringLegacyTypeMappingResultor.New(PersistenceLegacyTypeMappingResultor.New())InquiringLegacyTypeMappingResultor.New(
PersistenceLegacyTypeMappingResultor.New()) // implicitely 1.0
InquiringLegacyTypeMappingResultor.New(
PersistenceLegacyTypeMappingResultor.New(), 0.7) // 0.7 thresholdint customerid ; // -> pin
String firstname ; // -> firstName
String surname ; // -> lastName
String comment ; // discarded, NOT new commerceIdInteger pin ; // <- customerid
String firstName ; // <- firstname
String lastName ; // <- surname
String commerceId; // new, NOT old comment
Address address ; // new [***new***] pin
firstname -0,944----> firstName
surname -0,688----> lastName
comment -0,750----> commerceId
[***new***] address
customerid [discarded]customerid -[mapped]-> pin
firstname -0,944----> firstName
surname -0,688----> lastName
[***new***] commerceId
[***new***] address
comment [discarded]// Setup the database manager and start the managing threads
EmbeddedStorageManager storageManager = EmbeddedStorage.start();// Stop accessing the database
storageManager.shutdown();public class PersistenceStoringWithLogging implements PersistenceStoring
{
private final PersistenceStoring wrapped;
public PersistenceStoringWithLogging(final PersistenceStoring wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public long store(final Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return this.wrapped.store(instance);
}
@Override
public long[] storeAll(final Object... instances)
{
return this.wrapped.storeAll(instances);
}
@Override
public void storeAll(final Iterable<?> instances)
{
this.wrapped.storeAll(instances);
}
@Override
public void storeSelfStoring(final SelfStoring storing)
{
this.wrapped.storeSelfStoring(storing);
}
}public abstract class BaseWrapperPersistenceStoring implements PersistenceStoring
{
private final PersistenceStoring wrapped;
public BaseWrapperPersistenceStoring(final PersistenceStoring wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public long store(final Object instance)
{
return this.wrapped.store(instance);
}
@Override
public long[] storeAll(final Object... instances)
{
return this.wrapped.storeAll(instances);
}
@Override
public void storeAll(final Iterable<?> instances)
{
this.wrapped.storeAll(instances);
}
@Override
public void storeSelfStoring(final SelfStoring storing)
{
this.wrapped.storeSelfStoring(storing);
}
}public class PersistenceStoringWithLogging extends BaseWrapperPersistenceStoring
{
public PersistenceStoringWithLogging(PersistenceStoring wrapped)
{
super(wrapped);
}
@Override
public long store(Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return super.store(instance);
}
}public interface WrapperPersistenceStoring
extends Wrapper<PersistenceStoring>, PersistenceStoring
{
@Override
public default long store(final Object instance)
{
return this.wrapped().store(instance);
}
@Override
public default long[] storeAll(final Object... instances)
{
return this.wrapped().storeAll(instances);
}
@Override
public default void storeAll(final Iterable<?> instances)
{
this.wrapped().storeAll(instances);
}
@Override
public default void storeSelfStoring(final SelfStoring storing)
{
this.wrapped().storeSelfStoring(storing);
}
}public interface Wrapper<W>
{
public W wrapped();
public abstract class Abstract<W> implements Wrapper<W>
{
private final W wrapped;
protected Abstract(final W wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public final W wrapped()
{
return this.wrapped;
}
}
}public class PersistenceStoringWithLogging
implements WrapperPersistenceStoring
{
private final PersistenceStoring wrapped;
public PersistenceStoringWithLogging(final PersistenceStoring wrapped)
{
super();
this.wrapped = wrapped;
}
@Override
public PersistenceStoring wrapped()
{
return this.wrapped;
}
@Override
public long store(Object instance)
{
Logger.getLogger(PersistenceStoring.class.getName())
.info("Object stored: " + instance);
return WrapperPersistenceStoring.super.store(instance);
}
}LocaleURIURLPathjava.lang.AutoClosableStorer#skip



<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>persistence.binary.jdk8</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
</dependencies>final EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation();
foundation.onConnectionFoundation(BinaryHandlersJDK8::registerJDK8TypeHandlers);<repositories>
<repository>
<id>microstream-releases</id>
<url>https://repo.microstream.one/repository/maven-public</url>
</repository>
</repositories>
<dependencies>
repositories {
maven {
repositories {
maven {
url = uri("https://repo.microstream.one/repository/maven-public")
}
}
dependencies {
implementation("one.microstream:storage.embedded:04.00.00-MS-GA")
}resolvers += "microstream-releases" at "https://repo.microstream.one/repository/maven-public"
libraryDependencies += "one.microstream" % "storage.embedded" % "04.00.00-MS-GA"
__________________________________________________
[RAM ]{ Code } | ( Filesystem )
,- "Channel 0": [Data]{Thread} <-I|O-> (Storage Subdirectory 0)
/-- "Channel 1": [Data]{Thread} <-I|O-> (Storage Subdirectory 1)
StorageManager |
\-- "Channel 2": [Data]{Thread} <-I|O-> (Storage Subdirectory 2)
'- "Channel 3": [Data]{Thread} <-I|O-> (Storage Subdirectory 3)
_________________________________________________|<resolvers>
<ibiblio name="microstream-releases"
root="https://repo.microstream.one/repository/maven-public"
m2compatible="true" />
</resolvers><dependencies>
<dependency org="one.microstream"
name="storage.embedded"
rev="04.00.00-MS-GA" />
</dependencies>repositories.remote << 'https://repo.microstream.one/repository/maven-public'
define 'my-app' do
compile.with 'one.microstream:storage.embedded:04.00.00-MS-GA'
endload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "2.8"
RULES_JVM_EXTERNAL_SHA = "79c9850690d7614ecdb72d68394f994fef7534b292c4867ce5e7dec0aa7bdfad"
http_archive(
name = "rules_jvm_external",
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
sha256 = RULES_JVM_EXTERNAL_SHA,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = [
"one.microstream:storage.embedded:04.00.00-MS-GA"
],
repositories = [
"https://repo.microstream.one/repository/maven-public"
],
)maven_jar(
name = "microstream",
artifact = "one.microstream:storage.embedded:04.00.00-MS-GA"
)public class Contact
{
String name ;
String firstname;
int age ;
String email ;
String note ;
Object link ;
}public class Contact
{
String firstname ; // moved
String lastname ; // renamed
String emailAddress ; // renamed
String supportNode ; // renamed
PostalAddress postalAddress; // new
int age ; // moved
}----------
Legacy type mapping required for legacy type
1000055:Contact
to current type
1000056:Contact
Fields:
java.lang.String Contact#firstname -1.000 ----> java.lang.String Contact#firstname
java.lang.String Contact#name -0.750 ----> java.lang.String Contact#lastname
java.lang.String Contact#email -0.708 ----> java.lang.String Contact#emailAddress
java.lang.String Contact#note -0.636 ----> java.lang.String Contact#supportNode
[***new***] PostalAddress Contact#postalAddress
int Contact#age -1.000 ----> int Contact#age
java.lang.Object Contact#link [discarded]
---
Write 'y' to accept the mapping.EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation(myDataDir);
foundation.getConnectionFoundation().setLegacyTypeMappingResultor(
InquiringLegacyTypeMappingResultor.New(
PersistenceLegacyTypeMappingResultor.New()
)
);
EmbeddedStorageManager storageManager =
foundation.createEmbeddedStorageManager(myRoot).start();package com.my.app.entities;
public class OldContact
{
String name ;
String firstname;
int age ;
String email ;
String note ;
Object link ; // to be discarded
}package com.my.app.entities;
public class NewContact
{
String firstname ; // moved
String lastname ; // renamed
String emailAddress ; // renamed
String supportNote ; // renamed
PostalAddress postalAddress; // new
int age ; // moved
}old current
com.my.app.entities.OldContact com.my.app.entities.NewContact
com.my.app.entities.OldContact#firstname com.my.app.entities.NewContact#firstname
com.my.app.entities.OldContact#name com.my.app.entities.NewContact#lastname
com.my.app.entities.OldContact#email com.my.app.entities.NewContact#emailAddress
com.my.app.entities.OldContact#note com.my.app.entities.NewContact#supportNote
com.my.app.entities.NewContact#postalAddress
com.my.app.entities.OldContact#age com.my.app.entities.NewContact#age
com.my.app.entities.OldContact#link EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation(dataDir);
foundation.setRefactoringMappingProvider(
Persistence.RefactoringMapping(Paths.get("refactorings.csv"))
);
EmbeddedStorageManager storageManager =
foundation.createEmbeddedStorageManager(root).start();public interface Person extends Entity
{
public String firstName();
public String lastName();
}public class PersonEntity extends EntityLayerIdentity implements Person
{
protected PersonEntity()
{
super();
}
@Override
protected Person entityData()
{
return (Person)super.entityData();
}
@Override
public final String firstName()
{
return this.entityData().firstName();
}
@Override
public final String lastName()
{
return this.entityData().lastName();
}
}public class PersonData extends EntityData implements Person
{
private final String firstName;
private final String lastName ;
protected PersonData(final Person entity,
final String firstName,
final String lastName )
{
super(entity);
this.firstName = firstName;
this.lastName = lastName ;
}
@Override
public String firstName()
{
return this.firstName;
}
@Override
public String lastName()
{
return this.lastName;
}
}public interface PersonCreator extends Entity.Creator<Person, PersonCreator>
{
public PersonCreator firstName(String firstName);
public PersonCreator lastName(String lastName);
public static PersonCreator New()
{
return new Default();
}
public static PersonCreator New(final Person other)
{
return new Default().copy(other);
}
public class Default
extends Entity.Creator.Abstract<Person, PersonCreator>
implements PersonCreator
{
private String firstName;
private String lastName ;
protected Default()
{
super();
}
@Override
public PersonCreator firstName(final String firstName)
{
this.firstName = firstName;
return this;
}
@Override
public PersonCreator lastName(final String lastName)
{
this.lastName = lastName;
return this;
}
@Override
protected EntityLayerIdentity createEntityInstance()
{
return new PersonEntity();
}
@Override
public Person createData(final Person entityInstance)
{
return new PersonData(entityInstance,
this.firstName,
this.lastName );
}
@Override
public PersonCreator copy(final Person other)
{
final Person data = Entity.data(other);
this.firstName = data.firstName();
this.lastName = data.lastName ();
return this;
}
}
}public interface PersonUpdater extends Entity.Updater<Person, PersonUpdater>
{
public static boolean setFirstName(final Person person, final String firstName)
{
return New(person).firstName(firstName).update();
}
public static boolean setLastName(final Person person, final String lastName)
{
return New(person).lastName(lastName).update();
}
public PersonUpdater firstName(String firstName);
public PersonUpdater lastName(String lastName);
public static PersonUpdater New(final Person person)
{
return new Default(person);
}
public class Default
extends Entity.Updater.Abstract<Person, PersonUpdater>
implements PersonUpdater
{
private String firstName;
private String lastName ;
protected Default(final Person person)
{
super(person);
}
@Override
public PersonUpdater firstName(final String firstName)
{
this.firstName = firstName;
return this;
}
@Override
public PersonUpdater lastName(final String lastName)
{
this.lastName = lastName;
return this;
}
@Override
public Person createData(final Person entityInstance)
{
return new PersonData(entityInstance,
this.firstName,
this.lastName );
}
@Override
public PersonUpdater copy(final Person other)
{
final Person data = Entity.data(other);
this.firstName = data.firstName();
this.lastName = data.lastName ();
return this;
}
}
}public interface PersonHashEqualator extends HashEqualator<Person>
{
public static PersonHashEqualator New()
{
return new Default();
}
public final class Default implements PersonHashEqualator, Stateless
{
public static boolean equals(final Person person1, final Person person2)
{
return X.equal(person1.firstName(), person2.firstName())
&& X.equal(person1.lastName (), person2.lastName ())
;
}
public static int hashCode(final Person person)
{
return Objects.hash(
person.firstName(),
person.lastName ()
);
}
Default()
{
super();
}
@Override
public boolean equal(final Person person1, final Person person2)
{
return equals(person1, person2);
}
@Override
public int hash(final Person person)
{
return hashCode(person);
}
}
}public interface PersonAppendable extends VarString.Appendable
{
public static String toString(final Person person)
{
return New(person).appendTo(VarString.New()).toString();
}
public static PersonAppendable New(final Person person)
{
return new Default(person);
}
public static class Default implements PersonAppendable
{
private final Person person;
Default(final Person person)
{
super();
this.person = person;
}
@Override
public VarString appendTo(final VarString vs)
{
return vs.append(this.person.getClass().getSimpleName())
.append(" [lastName = ")
.append(this.person.lastName())
.append(", firstName = ")
.append(this.person.firstName())
.append(']');
}
}
}public interface Beeing<B>
{
public B partner();
}public interface Named
{
public String name();
}public interface Animal extends Beeing<Animal>, Entity
{
public String species();
}public interface Pet extends Animal, Named
{
}public interface Human extends Beeing<Human>, Named, Entity
{
}public class AnimalEntity extends EntityLayerIdentity implements Animal
{
protected AnimalEntity()
{
super();
}
@Override
protected Animal entityData()
{
return (Animal)super.entityData();
}
@Override
public final String species()
{
return this.entityData().species();
}
@Override
public final Animal partner()
{
return this.entityData().partner();
}
}public class AnimalData extends EntityData implements Animal
{
private final String species;
private final Animal partner;
protected AnimalData(final Animal entity,
final String species,
final Animal partner)
{
super(entity);
this.species = species;
this.partner = partner;
}
@Override
public String species()
{
return this.species;
}
@Override
public Animal partner()
{
return this.partner;
}
}public interface AnimalCreator extends Entity.Creator<Animal, AnimalCreator>
{
public AnimalCreator species(String species);
public AnimalCreator partner(Animal partner);
public static AnimalCreator New()
{
return new Default();
}
public static AnimalCreator New(final Animal other)
{
return new Default().copy(other);
}
public class Default
extends Entity.Creator.Abstract<Animal, AnimalCreator>
implements AnimalCreator
{
private String species;
private Animal partner;
protected Default()
{
super();
}
@Override
public AnimalCreator species(final String species)
{
this.species = species;
return this;
}
@Override
public AnimalCreator partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
protected EntityLayerIdentity createEntityInstance()
{
return new AnimalEntity();
}
@Override
public Animal createData(final Animal entityInstance)
{
return new AnimalData(entityInstance,
this.species,
this.partner);
}
@Override
public AnimalCreator copy(final Animal other)
{
final Animal data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
return this;
}
}
}public interface AnimalUpdater extends Entity.Updater<Animal, AnimalUpdater>
{
public static boolean setSpecies(final Animal animal, final String species)
{
return New(animal).species(species).update();
}
public static boolean setPartner(final Animal animal, final Animal partner)
{
return New(animal).partner(partner).update();
}
public AnimalUpdater species(String species);
public AnimalUpdater partner(Animal partner);
public static AnimalUpdater New(final Animal animal)
{
return new Default(animal);
}
public class Default
extends Entity.Updater.Abstract<Animal, AnimalUpdater>
implements AnimalUpdater
{
private String species;
private Animal partner;
protected Default(final Animal animal)
{
super(animal);
}
@Override
public AnimalUpdater species(final String species)
{
this.species = species;
return this;
}
@Override
public AnimalUpdater partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
public Animal createData(final Animal entityInstance)
{
return new AnimalData(entityInstance,
this.species,
this.partner);
}
@Override
public AnimalUpdater copy(final Animal other)
{
final Animal data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
return this;
}
}
}public class PetEntity extends EntityLayerIdentity implements Pet
{
protected PetEntity()
{
super();
}
@Override
protected Pet entityData()
{
return (Pet)super.entityData();
}
@Override
public final String species()
{
return this.entityData().species();
}
@Override
public final Animal partner()
{
return this.entityData().partner();
}
@Override
public final String name()
{
return this.entityData().name();
}
}public class PetData extends EntityData implements Pet
{
private final String species;
private final Animal partner;
private final String name ;
protected PetData(final Pet entity,
final String species,
final Animal partner,
final String name )
{
super(entity);
this.species = species;
this.partner = partner;
this.name = name ;
}
@Override
public String species()
{
return this.species;
}
@Override
public Animal partner()
{
return this.partner;
}
@Override
public String name()
{
return this.name;
}
}public interface PetCreator extends Entity.Creator<Pet, PetCreator>
{
public PetCreator species(String species);
public PetCreator partner(Animal partner);
public PetCreator name(String name);
public static PetCreator New()
{
return new Default();
}
public static PetCreator New(final Pet other)
{
return new Default().copy(other);
}
public class Default
extends Entity.Creator.Abstract<Pet, PetCreator>
implements PetCreator
{
private String species;
private Animal partner;
private String name ;
protected Default()
{
super();
}
@Override
public PetCreator species(final String species)
{
this.species = species;
return this;
}
@Override
public PetCreator partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
public PetCreator name(final String name)
{
this.name = name;
return this;
}
@Override
protected EntityLayerIdentity createEntityInstance()
{
return new PetEntity();
}
@Override
public Pet createData(final Pet entityInstance)
{
return new PetData(entityInstance,
this.species,
this.partner,
this.name );
}
@Override
public PetCreator copy(final Pet other)
{
final Pet data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
this.name = data.name ();
return this;
}
}
}public interface PetUpdater extends Entity.Updater<Pet, PetUpdater>
{
public static boolean setSpecies(final Pet pet, final String species)
{
return New(pet).species(species).update();
}
public static boolean setPartner(final Pet pet, final Animal partner)
{
return New(pet).partner(partner).update();
}
public static boolean setName(final Pet pet, final String name)
{
return New(pet).name(name).update();
}
public PetUpdater species(String species);
public PetUpdater partner(Animal partner);
public PetUpdater name(String name);
public static PetUpdater New(final Pet pet)
{
return new Default(pet);
}
public class Default
extends Entity.Updater.Abstract<Pet, PetUpdater>
implements PetUpdater
{
private String species;
private Animal partner;
private String name ;
protected Default(final Pet pet)
{
super(pet);
}
@Override
public PetUpdater species(final String species)
{
this.species = species;
return this;
}
@Override
public PetUpdater partner(final Animal partner)
{
this.partner = partner;
return this;
}
@Override
public PetUpdater name(final String name)
{
this.name = name;
return this;
}
@Override
public Pet createData(final Pet entityInstance)
{
return new PetData(entityInstance,
this.species,
this.partner,
this.name );
}
@Override
public PetUpdater copy(final Pet other)
{
final Pet data = Entity.data(other);
this.species = data.species();
this.partner = data.partner();
this.name = data.name ();
return this;
}
}
}public class HumanEntity extends EntityLayerIdentity implements Human
{
protected HumanEntity()
{
super();
}
@Override
protected Human entityData()
{
return (Human)super.entityData();
}
@Override
public final Human partner()
{
return this.entityData().partner();
}
@Override
public final String name()
{
return this.entityData().name();
}
}<dependency>
<groupId>one.microstream</groupId>
<artifactId>filesystem.sql</artifactId>
<version>04.00.00-MS-GA</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.7.0.0</version>
</dependency>OracleDataSource dataSource = new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@localhost:1521/db");
dataSource.setUser("user");
dataSource.setPassword("secret");
SqlFileSystem fileSystem = SqlFileSystem.New(
SqlConnector.Caching(
SqlProviderOracle.New(dataSource)
)
);
EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));