package org.n3r.eql.impl;
import com.google.common.base.Optional;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import lombok.val;
import org.n3r.eql.base.EqlResourceLoader;
import org.n3r.eql.parser.EqlBlock;
import org.n3r.eql.parser.EqlParser;
import java.util.HashMap;
import java.util.Map;
public class EqlResourceLoaderHelper {
public static LoadingCache<EqlUniqueSqlId, Optional<EqlBlock>> buildSqlCache(
final Cache<String, Optional<Map<String, EqlBlock>>> fileCache) {
return CacheBuilder.newBuilder().build(
new CacheLoader<EqlUniqueSqlId, Optional<EqlBlock>>() {
@Override
public Optional<EqlBlock> load(EqlUniqueSqlId eqlUniqueSqlId) throws Exception {
return loadBlocks(fileCache, eqlUniqueSqlId);
}
}
);
}
private static Optional<EqlBlock> loadBlocks(
Cache<String, Optional<Map<String, EqlBlock>>> fileCache,
EqlUniqueSqlId eqlUniqueSqlId) {
val blocks = fileCache.getIfPresent(eqlUniqueSqlId.getSqlClassPath());
if (!blocks.isPresent()) return Optional.absent();
val eqlBlock = blocks.get().get(eqlUniqueSqlId.getSqlId());
if (eqlBlock == null) return Optional.absent();
eqlBlock.tryParseSqls();
return Optional.of(eqlBlock);
}
public static void updateBlockCache(
String sqlContent,
EqlResourceLoader eqlResourceLoader,
String sqlClassPath,
Cache<EqlUniqueSqlId, Optional<EqlBlock>> sqlCache,
Cache<String, Optional<Map<String, EqlBlock>>> fileCache) {
val oldBlocks = fileCache.getIfPresent(sqlClassPath);
val oldSqlIds = oldBlocks.or(new HashMap<String, EqlBlock>()).keySet();
val eqlParser = new EqlParser(eqlResourceLoader, sqlClassPath);
val sqlBlocks = eqlParser.parse(sqlContent);
for (EqlBlock sqlBlock : sqlBlocks.values()) {
val uniqueSqlId = sqlBlock.getUniqueSqlId();
sqlCache.put(uniqueSqlId, Optional.of(sqlBlock));
oldSqlIds.remove(uniqueSqlId.getSqlId());
}
for (String uniqueId : oldSqlIds) {
sqlCache.invalidate(new EqlUniqueSqlId(sqlClassPath, uniqueId));
}
fileCache.put(sqlClassPath, Optional.of(sqlBlocks));
}
public static Map<String, EqlBlock> updateFileCache(
String sqlContent,
EqlResourceLoader eqlResourceLoader,
String sqlClassPath, boolean eqlLazyLoad) {
EqlParser eqlParser = new EqlParser(eqlResourceLoader, sqlClassPath);
return eqlLazyLoad ? eqlParser.delayParse(sqlContent) : eqlParser.parse(sqlContent);
}
}