package org.rakam.analysis;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.eventbus.EventBus;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.rakam.analysis.metadata.AbstractMetastore;
import org.rakam.collection.FieldDependencyBuilder;
import org.rakam.collection.FieldDependencyBuilder.FieldDependency;
import org.rakam.collection.SchemaField;
import org.rakam.util.NotExistsException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
public class InMemoryMetastore extends AbstractMetastore {
private final Map<String, Map<String, List<SchemaField>>> collections = new ConcurrentHashMap<>();
private final ApiKeyService apiKeyService;
public InMemoryMetastore(ApiKeyService apiKeyService) {
super(new EventBus());
this.apiKeyService = apiKeyService;
}
public InMemoryMetastore(ApiKeyService apiKeyService, EventBus eventBus) {
super(eventBus);
this.apiKeyService = apiKeyService;
}
@Override
public Map<String, List<SchemaField>> getCollections(String project) {
return collections.get(project);
}
@Override
public Set<String> getCollectionNames(String project) {
return collections.get(project).keySet();
}
@Override
public void createProject(String project) {
collections.put(project, new HashMap<>());
}
@Override
public Set<String> getProjects() {
return collections.keySet();
}
@Override
public List<SchemaField> getCollection(String project, String collection) {
return collections.getOrDefault(project, ImmutableMap.of()).getOrDefault(collection, ImmutableList.of());
}
@Override
public synchronized List<SchemaField> getOrCreateCollectionFields(String project, String collection, Set<SchemaField> fields) throws NotExistsException {
Map<String, List<SchemaField>> list = collections.get(project);
if(list == null) {
throw new NotExistsException("Project");
}
List<SchemaField> schemaFields = list.computeIfAbsent(collection, (key) -> new ArrayList<>());
fields.stream()
.filter(field -> !schemaFields.stream().anyMatch(f -> f.getName().equals(field.getName())))
.forEach(schemaFields::add);
return schemaFields;
}
@Override
public void deleteProject(String project) {
collections.remove(project);
apiKeyService.revokeAllKeys(project);
super.onDeleteProject(project);
}
}