blob: 6fd099cf69c12f68a72f83349396d70ba7d75ee8 [file] [log] [blame]
/*
* Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation
package org.eclipse.persistence.descriptors;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.persistence.internal.helper.ClassConstants;
import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.internal.identitymaps.WeakIdentityMap;
/**
* <p><b>Purpose</b>:
* Define a secondary index on the cache.
*
* @see CachePolicy
*/
public class CacheIndex implements Cloneable, Serializable {
protected boolean isUpdateable = true;
protected boolean isInsertable = true;
protected List<DatabaseField> fields;
/** Allows the cache size to be set. */
protected int cacheSize;
/** Allows the identity map class type to be set. */
protected Class<? extends WeakIdentityMap> cacheType = ClassConstants.WeakIdentityMap_Class;
public CacheIndex() {
this.fields = new ArrayList<>();
}
public CacheIndex(DatabaseField[] fields) {
this.fields = new ArrayList<>(fields.length);
Collections.addAll(this.fields, fields);
}
public CacheIndex(String... fields) {
this.fields = new ArrayList<>(fields.length);
for (String field : fields) {
this.fields.add(new DatabaseField(field));
}
}
public CacheIndex(List<DatabaseField> fields) {
this.fields = fields;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
/**
* Return if the index field can be updated.
*/
public boolean isUpdateable() {
return isUpdateable;
}
/**
* Set if the index field can be updated.
* If updateable the object will be re-indexed on each update/refresh.
*/
public void setIsUpdateable(boolean isUpdateable) {
this.isUpdateable = isUpdateable;
}
/**
* Return if the index field can be inserted.
*/
public boolean isInsertable() {
return isInsertable;
}
/**
* Set if the index field can be inserted.
* If insertable the object will be indexed after insert.
*/
public void setIsInsertable(boolean isInsertable) {
this.isInsertable = isInsertable;
}
/**
* ADVANCED:
* Return the type of the cache used for the index.
* This default to a weak cache, and should normally not be changed.
* For a weak cache, the index will remain until the object gcs from the main cache.
*/
public Class getCacheType() {
return cacheType;
}
/**
* ADVANCED:
* Set the type of the cache used for the index.
* This default to a weak cache, and should normally not be changed.
* For a weak cache, the index will remain until the object gcs from the main cache.
*/
public void setCacheType(Class<? extends WeakIdentityMap> cacheType) {
this.cacheType = cacheType;
}
/**
* ADVANCED:
* Return the cache size.
* This is either the initial size, sub-cache size, or fixed size depending on the cache type.
*/
public int getCacheSize() {
return cacheSize;
}
/**
* ADVANCED:
* Set the cache size.
* This is either the initial size, sub-cache size, or fixed size depending on the cache type.
*/
public void setCacheSize(int cacheSize) {
this.cacheSize = cacheSize;
}
public void addField(DatabaseField field) {
this.fields.add(field);
}
/**
* PUBLIC:
* Add the database column name to the cache index.
*/
public void addFieldName(String field) {
addField(new DatabaseField(field));
}
public List<DatabaseField> getFields() {
return fields;
}
public void setFields(List<DatabaseField> fields) {
this.fields = fields;
}
@Override
public String toString() {
return "CacheIndex(" + getFields() + ")";
}
}