blob: 445441d0d9c6ea7b3153885104a7b8c30ddcaccb [file] [log] [blame]
/*
* 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.
*/
package org.apache.carbondata.datamap.bloom;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.carbondata.common.annotations.InterfaceAudience;
import org.apache.carbondata.core.cache.Cache;
import org.apache.carbondata.core.cache.CarbonLRUCache;
import org.apache.carbondata.core.memory.MemoryException;
import org.apache.hadoop.util.bloom.CarbonBloomFilter;
/**
* This class is used to add cache for bloomfilter datamap to accelerate query through it.
* The cache is implemented using carbon lru cache.
* As for the cache, the key is a bloomindex file for a shard and the value is the bloomfilters
* for the blocklets in this shard.
*/
@InterfaceAudience.Internal
public class BloomDataMapCache
implements Cache<BloomCacheKeyValue.CacheKey, BloomCacheKeyValue.CacheValue> {
/**
* CarbonLRU cache
*/
private CarbonLRUCache lruCache;
public BloomDataMapCache(CarbonLRUCache lruCache) {
this.lruCache = lruCache;
}
@Override
public BloomCacheKeyValue.CacheValue get(BloomCacheKeyValue.CacheKey key)
throws IOException {
BloomCacheKeyValue.CacheValue cacheValue = getIfPresent(key);
if (cacheValue == null) {
List<CarbonBloomFilter> bloomFilters =
BloomIndexFileStore.loadBloomFilterFromFile(key.getShardPath(), key.getIndexColumn());
cacheValue = new BloomCacheKeyValue.CacheValue(bloomFilters);
lruCache.put(key.toString(), cacheValue, cacheValue.getMemorySize());
}
return cacheValue;
}
@Override
public List<BloomCacheKeyValue.CacheValue> getAll(List<BloomCacheKeyValue.CacheKey> keys)
throws IOException {
List<BloomCacheKeyValue.CacheValue> cacheValues = new ArrayList<>();
for (BloomCacheKeyValue.CacheKey key : keys) {
BloomCacheKeyValue.CacheValue cacheValue = get(key);
cacheValues.add(cacheValue);
}
return cacheValues;
}
@Override
public BloomCacheKeyValue.CacheValue getIfPresent(BloomCacheKeyValue.CacheKey key) {
return (BloomCacheKeyValue.CacheValue) lruCache.get(key.toString());
}
@Override
public void invalidate(BloomCacheKeyValue.CacheKey key) {
lruCache.remove(key.toString());
}
@Override
public void put(BloomCacheKeyValue.CacheKey key, BloomCacheKeyValue.CacheValue value)
throws IOException, MemoryException {
// No impl required.
}
@Override
public void clearAccessCount(List<BloomCacheKeyValue.CacheKey> keys) {
}
}