/*
* 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.
*/
/*
* DummyQRegion.java
*
* Created on March 15, 2005, 6:40 PM
*/
package org.apache.geode.cache.query.internal.index;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.query.SelectResults;
import org.apache.geode.cache.query.internal.QRegion;
import org.apache.geode.cache.query.internal.ResultsBag;
import org.apache.geode.cache.query.internal.ResultsSet;
import org.apache.geode.cache.query.internal.types.TypeUtils;
import org.apache.geode.cache.query.types.ObjectType;
import org.apache.geode.internal.cache.CachedDeserializable;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.LocalRegion;
import org.apache.geode.internal.cache.RegionEntry;
import org.apache.geode.internal.cache.RegionEntryContext;
import org.apache.geode.internal.i18n.LocalizedStrings;
import org.apache.geode.internal.offheap.StoredObject;
import org.apache.geode.internal.offheap.annotations.Released;
import org.apache.geode.internal.offheap.annotations.Retained;
/**
*
*/
public class DummyQRegion extends QRegion {
private RegionEntry entry = null;
private ObjectType valueType = TypeUtils.OBJECT_TYPE;
private ObjectType keyType = TypeUtils.OBJECT_TYPE;
private ResultsBag values = null;
private ResultsSet keys = null;
private ResultsSet entries = null;
private List valueInList = null;
private Object[] valueInArray = null;
public DummyQRegion(Region region) {
super(region, false);
Class constraint = region.getAttributes().getValueConstraint();
if (constraint != null)
valueType = TypeUtils.getObjectType(constraint);
constraint = region.getAttributes().getKeyConstraint();
if (constraint != null)
keyType = TypeUtils.getObjectType(constraint);
values = new ResultsBag(((GemFireCacheImpl) region.getCache()).getCachePerfStats());
values.setElementType(valueType);
keys = new ResultsSet();
keys.setElementType(keyType);
entries = new ResultsSet();
entries.setElementType(TypeUtils.getRegionEntryType(region)); // gets key and value types from
// region
}
@Override
public boolean equals(Object o) { // for findbugs
return super.equals(o);
}
@Override
public int hashCode() { // for findbugs
return super.hashCode();
}
public void setEntry(RegionEntry e) {
this.entry = e;
}
public RegionEntry getEntry() {
return this.entry;
}
@Override
public SelectResults getKeys() {
if (keys == null) {
keys = new ResultsSet();
keys.setElementType(keyType);
}
keys.clear();
keys.add(entry.getKey());
return keys;
}
@Override
public Set keySet() {
return (ResultsSet) getKeys();
}
@Override
public Set keys() {
return keySet();
}
@Override
public Collection values() {
return getValues();
}
@Override
public Set asSet() {
return getValues().asSet();
}
@Override
public List asList() {
if (valueInList == null) {
valueInList = new ArrayList(1);
}
valueInList.clear();
Object val = this.entry.getValueOffHeapOrDiskWithoutFaultIn((LocalRegion) getRegion());
if (val instanceof StoredObject) {
@Retained
@Released
StoredObject ohval = (StoredObject) val;
try {
val = ohval.getDeserializedValue(getRegion(), this.entry);
} finally {
ohval.release();
}
} else if (val instanceof CachedDeserializable) {
val = ((CachedDeserializable) val).getDeserializedValue(getRegion(), this.entry);
}
valueInList.add(val);
return valueInList;
}
@Override
public Object[] toArray() {
if (valueInArray == null) {
valueInArray = new Object[1];
}
Object val = this.entry.getValueOffHeapOrDiskWithoutFaultIn((LocalRegion) getRegion());
if (val instanceof StoredObject) {
@Retained
@Released
StoredObject ohval = (StoredObject) val;
try {
val = ohval.getDeserializedValue(getRegion(), this.entry);
} finally {
ohval.release();
}
} else if (val instanceof CachedDeserializable) {
val = ((CachedDeserializable) val).getDeserializedValue(getRegion(), this.entry);
}
valueInArray[0] = val;
return valueInArray;
}
@Override
public SelectResults getValues() {
if (values == null) {
values = new ResultsBag(((GemFireCacheImpl) getRegion().getCache()).getCachePerfStats());
values.setElementType(valueType);
}
values.clear();
Object val = this.entry.getValueOffHeapOrDiskWithoutFaultIn((LocalRegion) getRegion());
if (val instanceof StoredObject) {
@Retained
@Released
StoredObject ohval = (StoredObject) val;
try {
val = ohval.getDeserializedValue(getRegion(), this.entry);
} finally {
ohval.release();
}
} else if (val instanceof CachedDeserializable) {
val = ((CachedDeserializable) val).getDeserializedValue(getRegion(), this.entry);
}
values.add(val);
return values;
}
@Override
public SelectResults getEntries() {
if (entries == null) {
entries = new ResultsSet();
entries.setElementType(TypeUtils.getRegionEntryType(getRegion()));
}
entries.clear();
// return collection of Region.Entry, not (dotless) RegionEntry
Region rgn = getRegion();
// unwrap until we get the LocalRegion
while (!(rgn instanceof LocalRegion)) {
rgn = ((QRegion) TypeUtils.checkCast(rgn, QRegion.class)).getRegion();
}
entries.add(((LocalRegion) rgn).new NonTXEntry(entry));
return entries;
}
@Override
public SelectResults entrySet() {
return getEntries();
}
@Override
public Set entries(boolean recursive) {
return (ResultsSet) getEntries();
}
@Override
public Region.Entry getEntry(Object key) {
LocalRegion.NonTXEntry e = (LocalRegion.NonTXEntry) super.getEntry(key);
Region.Entry retVal = null;
if (e != null && this.entry == e.getRegionEntry()) {
retVal = e;
}
return retVal;
}
@Override
public Iterator iterator() {
return values().iterator();
}
@Override
public int size() {
return 1;
}
@Override
public Object[] toArray(Object[] obj) {
throw new RuntimeException(
LocalizedStrings.DummyQRegion_NOT_YET_IMPLEMENTED.toLocalizedString());
}
@Override
public String toString() {
return "DQR " + super.toString();
}
}