All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.googlecode.cqengine.entity.MapEntity Maven / Gradle / Ivy

Go to download

Collection Query Engine: NoSQL indexing and query engine for Java collections with ultra-low latency

There is a newer version: 3.6.0
Show newest version
/**
 * Copyright 2012-2015 Niall Gallagher
 * 

* Licensed 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 com.googlecode.cqengine.entity; import com.googlecode.cqengine.query.QueryFactory; import java.util.Collection; import java.util.Map; import java.util.Set; /** * Wrapper for Map to allow efficient use in an IndexCollection. * MapEntities can be created via {@link QueryFactory#mapEntity(Map)}. Attributes can be created to read the entries * in these maps, using {@link QueryFactory#mapAttribute(Object, Class)}. *

* This works by optimizing the performance of the {@link #hashCode()} and {@link #equals(Object)} methods - which * may be called frequently during query processing. The hashCode of the wrapped Map will be cached to improve the * performance of repeated invocations of {@link #hashCode()}. The cached hashCode will be used in the * implementation of the {@link #equals(Object)} method too, to avoid computing equality entirely when the cached * hashCodes are different. *

* Note it is not safe to modify entries in maps which are indexed, although non-indexed entries may be modified * safely. Alternatively, remove and re-add the Map to the collection. */ @SuppressWarnings({"unchecked", "NullableProblems"}) public class MapEntity implements Map { final Map wrappedMap; final int cachedHashCode; public MapEntity(Map mapToWrap) { this(mapToWrap, mapToWrap.hashCode()); } protected MapEntity(Map mapToWrap, int hashCode) { wrappedMap = mapToWrap; cachedHashCode = hashCode; } /** * Returns the wrapped map. */ public Map getWrappedMap() { return wrappedMap; } /** * Returns the hashcode of the wrapped map which was cached when this MapEntity was created. * @return the hashcode of the wrapped map which was cached when this MapEntity was created. */ @Override public int hashCode() { return cachedHashCode; } /** * Returns true if the cached hashcodes of both objects are equal and the wrapped maps are equal. */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof MapEntity)) { return false; } MapEntity that = (MapEntity) o; if (cachedHashCode != that.cachedHashCode) { return false; } return this.wrappedMap.equals(that.wrappedMap); } @Override public String toString() { return "MapEntity{" + "cachedHashCode=" + cachedHashCode + ", wrappedMap=" + wrappedMap + '}'; } public Object get(Object key) { return wrappedMap.get(key); } @Override public Object put(Object o, Object o2) { return wrappedMap.put(o, o2); } @Override public Object remove(Object o) { return wrappedMap.remove(o); } @Override public void putAll(Map map) { wrappedMap.putAll(map); } @Override public void clear() { wrappedMap.clear(); } @Override public Set keySet() { return wrappedMap.keySet(); } @Override public Collection values() { return wrappedMap.values(); } @Override public Set entrySet() { return wrappedMap.entrySet(); } @Override public int size() { return wrappedMap.size(); } @Override public boolean isEmpty() { return wrappedMap.isEmpty(); } @Override public boolean containsKey(Object o) { return wrappedMap.containsKey(o); } @Override public boolean containsValue(Object o) { return wrappedMap.containsValue(o); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy