Our goal is to define a single place where all type information will reside. We define TypeConfiguration class which will have multiple type extensions for different features. This configuration will be set for the whole Ignite instance with ability to override it on per-cache level.
TypeConfiguration
Code Block |
---|
|
public class TypeConfiguration implements Serializable {
/**
*
Serial version UID. */
public class TypeConfiguration implements Serializable { private static final long serialVersionUID = 0L;
/**
* Type name. Can be one of three things:
* - Simple type name. Supports wildcards.. Use it when type is not in classpath;
* - Fully qualified type name. Prefer it when type is in classpath to avoid conflicts.
* E.g. "my.package.employee.Address", "my.package.organization.Address";
* - Package wildcard. Must ends with ".*" in this case. E.g. "my.package.*".
*/
private String typeName;
/** Used to configure single type when it is not in classpath. */
public void setTypeName(String);
/** Used to configure specific class. Both typeName and packageName fields will be set. */
public void setClass(Class);
/** Affinity key field name. */
private String affKeyFieldName;
/** Type info extensions. */
private Map<Class<? extends TypeInfo>, ? extends TypeInfo> typeInfos;
public voidTypeInfo[] setTypeInfos(Collection<? extends TypeInfo> typeInfosgetTypeInfo() {...}
public Collection<? extends TypeInfo> getTypeInfos(void setTypeInfo(TypeInfo... typeInfos) {...}
public <T extends TypeInfo> T getTypeInfo(Class<T> infoCls) {...}
} |
Notes:
- TypeInfo's are set as varargs to follow general Ignite rules (e.g. IgniteConfiguration.setCacheConfiguration()).
- TypeInfo getter/setter do not have "s" at the end to follow general Ignite rules (e.g. IgniteConfiguration.setCacheConfiguration());
- Shouldn't we move "affKeyFieldName" to another TypeInfo, e.g. AffinityKeyTypeInfo?
TypeInfo
Code Block |
---|
|
public interface TypeInfo extends Serializable {
/** Whether implemenation supports single type. */
bool supportSingleType();
*
/** Whether implementation supports multiple types. */
public interface TypeInfo extends Serializable {bool supportMultipleTypes();
} |
Notes:
- Package configuration are only supported by PortableTypeInfo for now. For this reason it makes sense to add "support*" methods to prevent misconfiguration.
PersistenceTypeInfo
Code Block |
---|
|
public class PersistenceTypeInfo implements TypeInfo {
/**
*
Serial version UID. */
public class PersistenceTypeInfo implements TypeInfo { private static final long serialVersionUID = 0L;
/** Schema name in database. */
private String dbSchema;
/** Table name in database. */
private String dbTbl;
/** Persisted fields. */
@GridToStringInclude
private Collection<PersistenceFieldInfo>Collection<PersistenceField> fields;
} |
Code Block |
---|
|
/**
* Type field metadata.
*/
public class PersistenceFieldInfoPersistenceField implements Serializable {
/** Serial version UID. */
private static final long serialVersionUID = 0L;
/** Column name in database. */
private String dbNamedbFieldName;
/** Column JDBC type in database. */
private int dbTypedbFieldType;
/** Field name in java object. */
private String javaNamejavaFieldName;
/** Corresponding java type. */
private Class<?> javaTypejavaFieldType;
} |
Notes:
- Package wildcards are not supported.
PortableTypeInfo
Code Block |
---|
|
/**
*
*/
public class PortableTypeInfo implements TypeInfo {
/** IDSerial version mapperUID. */
private PortableIdMapper idMapper static final long serialVersionUID = 0L;
/** ID Serializermapper. */
private PortableSerializerPortableIdMapper serializeridMapper;
/** Use timestamp flagSerializer. */
private BooleanPortableSerializer useTsserializer;
/** MetaPortable datametadata enabled flag. When disabled queries and pretty toString() will not work. */
private Boolean metaDataEnabled = true;
} |
Notes:
- Supported for both types and package wildcards.
QueryTypeInfo
Code Block |
---|
|
public class QueryTypeInfo implements TypeInfo {
/** Serial version UID. */
private static final long serialVersionUID = 0L;
/*
* Fields. */
public class QueryTypeInfo implementsprivate TypeInfo {QueryField[] flds;
/** Field name-to-type map to be queried, in addition to indexed fieldsGroup indexes. */
private QueryCompoundIndex[] grpIdxs;
/** Fields to index as text. */
@GridToStringIncludeprivate String[] txtIdxs;
} |
Code Block |
---|
|
public class QueryField implements Serializable {
/** Serial version UID. */
private Map<String, Class<?>> qryFlds static final long serialVersionUID = 0L;
/** Field name-to-type map to index in ascending order. */
private String name;
/** Field class. */
private @GridToStringIncludeClass cls;
/** Whether to index the field. Disabled by default. */
private QueryFieldIndexType Map<String, Class<?>> ascFlds;
idxTyp = QueryFieldIndexType.NONE;
} |
Code Block |
---|
|
public enum QueryFieldIndexType {
/** Do not index the field. */
Field name-to-type map to index in descending NONE,
/** Ascending order. */
@GridToStringInclude
private Map<String, Class<ASC,
/** Descending order. */
DESC
} |
Code Block |
---|
|
public class QueryCompoundIndex implements Serializable {?>> descFlds;
/** FieldsSerial to index as textversion UID. */
private static final long serialVersionUID @GridToStringInclude
private Collection<String> txtFlds;
= 0L;
/** Index name. */
String name;
/** Participating fields. * Fields to create group indexes for. */
@GridToStringInclude/
private QueryFieldInfo[] flds;
} |
Notes
QueryFieldInfo.cls is a problem for non-Java users, because they have to write ugly things like "java.lang.Integer" which is very hard to understand for non-Java users. Lets switch to enum here?
IgniteConfiguration
Code Block |
---|
|
public class IgniteConfiguration {
/** Type configurations. */
private TypeConfiguration[] typeCfg;
public TypeConfiguration[] getTypeConfiguration();
public void setTypeConfiguration(TypeConfiguration... typeCfg);
} |
CacheConfiguration
Code Block |
---|
|
public class CacheConfiguration {
/** Type configurations. */
private Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> grps TypeConfiguration[] typeCfg;
public TypeConfiguration[] getTypeConfiguration();
public void setTypeConfiguration(TypeConfiguration... typeCfg);
} |