use of nl.knaw.huygens.timbuctoo.v5.datastores.schemastore.dto.ExplicitField in project timbuctoo by HuygensING.
the class RootQuery method rebuildSchema.
public synchronized GraphQLSchema rebuildSchema() {
final TypeDefinitionRegistry staticQuery = schemaParser.parse(this.staticQuery);
if (archetypes != null && !archetypes.isEmpty()) {
staticQuery.merge(schemaParser.parse(archetypes + "extend type DataSetMetadata {\n" + " archetypes: Archetypes! @passThrough\n" + "}\n" + "\n"));
}
TypeDefinitionRegistry registry = new TypeDefinitionRegistry();
registry.merge(staticQuery);
final RuntimeWiring.Builder wiring = RuntimeWiring.newRuntimeWiring();
wiring.type("Query", builder -> builder.dataFetcher("promotedDataSets", env -> dataSetRepository.getPromotedDataSets().stream().map(DataSetWithDatabase::new).collect(Collectors.toList())).dataFetcher("allDataSets", env -> dataSetRepository.getDataSets().stream().map(DataSetWithDatabase::new).filter(x -> {
if (x.isPublished()) {
return true;
} else {
ContextData contextData = env.getContext();
UserPermissionCheck userPermissionCheck = contextData.getUserPermissionCheck();
return userPermissionCheck.getPermissions(x.getDataSet().getMetadata()).contains(Permission.READ);
}
}).collect(Collectors.toList())).dataFetcher("dataSetMetadata", env -> {
final String dataSetId = env.getArgument("dataSetId");
ContextData context = env.getContext();
final User user = context.getUser().orElse(null);
Tuple<String, String> splitCombinedId = DataSetMetaData.splitCombinedId(dataSetId);
return dataSetRepository.getDataSet(user, splitCombinedId.getLeft(), splitCombinedId.getRight()).map(DataSetWithDatabase::new);
}).dataFetcher("dataSetMetadataList", env -> {
Stream<DataSetWithDatabase> dataSets = dataSetRepository.getDataSets().stream().map(DataSetWithDatabase::new);
if (env.getArgument("promotedOnly")) {
dataSets = dataSets.filter(DataSetWithDatabase::isPromoted);
}
if (env.getArgument("publishedOnly")) {
dataSets = dataSets.filter(DataSetWithDatabase::isPublished);
}
return dataSets.filter(x -> {
ContextData contextData = env.getContext();
UserPermissionCheck userPermissionCheck = contextData.getUserPermissionCheck();
return userPermissionCheck.getPermissions(x.getDataSet().getMetadata()).contains(Permission.READ);
}).collect(Collectors.toList());
}).dataFetcher("aboutMe", env -> ((RootData) env.getRoot()).getCurrentUser().orElse(null)).dataFetcher("availableExportMimetypes", env -> supportedFormats.getSupportedMimeTypes().stream().map(MimeTypeDescription::create).collect(Collectors.toList())));
wiring.type("DataSetMetadata", builder -> builder.dataFetcher("currentImportStatus", env -> {
DataSetMetaData input = env.getSource();
Optional<User> currentUser = ((RootData) env.getRoot()).getCurrentUser();
if (!currentUser.isPresent()) {
throw new RuntimeException("User is not provided");
}
return dataSetRepository.getDataSet(currentUser.get(), input.getOwnerId(), input.getDataSetId()).map(dataSet -> dataSet.getImportManager().getImportStatus());
}).dataFetcher("dataSetImportStatus", env -> {
Optional<User> currentUser = ((RootData) env.getRoot()).getCurrentUser();
if (!currentUser.isPresent()) {
throw new RuntimeException("User is not provided");
}
DataSetMetaData input = env.getSource();
return dataSetRepository.getDataSet(currentUser.get(), input.getOwnerId(), input.getDataSetId()).map(dataSet -> dataSet.getImportManager().getDataSetImportStatus());
}).dataFetcher("collectionList", env -> getCollections(env.getSource(), ((ContextData) env.getContext()).getUser())).dataFetcher("collection", env -> {
String collectionId = (String) env.getArguments().get("collectionId");
if (collectionId != null && collectionId.endsWith("List")) {
collectionId = collectionId.substring(0, collectionId.length() - "List".length());
}
DataSetMetaData input = env.getSource();
ContextData context = env.getContext();
final User user = context.getUser().orElse(null);
final DataSet dataSet = dataSetRepository.getDataSet(user, input.getOwnerId(), input.getDataSetId()).get();
final TypeNameStore typeNameStore = dataSet.getTypeNameStore();
String collectionUri = typeNameStore.makeUri(collectionId);
if (dataSet.getSchemaStore().getStableTypes() == null || dataSet.getSchemaStore().getStableTypes().get(collectionUri) == null) {
return null;
} else {
return getCollection(dataSet, typeNameStore, dataSet.getSchemaStore().getStableTypes().get(collectionUri));
}
}).dataFetcher("dataSetId", env -> ((DataSetMetaData) env.getSource()).getCombinedId()).dataFetcher("dataSetName", env -> ((DataSetMetaData) env.getSource()).getDataSetId()).dataFetcher("ownerId", env -> ((DataSetMetaData) env.getSource()).getOwnerId()));
wiring.type("CurrentImportStatus", builder -> builder.dataFetcher("elapsedTime", env -> {
final String timeUnit = env.getArgument("unit");
return ((ImportStatus) env.getSource()).getElapsedTime(timeUnit);
}));
wiring.type("DataSetImportStatus", builder -> builder.dataFetcher("lastImportDuration", env -> {
final String timeUnit = env.getArgument("unit");
return ((DataSetImportStatus) env.getSource()).getLastImportDuration(timeUnit);
}));
wiring.type("EntryImportStatus", builder -> builder.dataFetcher("elapsedTime", env -> {
final String timeUnit = env.getArgument("unit");
return ((EntryImportStatus) env.getSource()).getElapsedTime(timeUnit);
}));
wiring.type("CollectionMetadata", builder -> builder.dataFetcher("indexConfig", env -> {
SubjectReference source = env.getSource();
final QuadStore qs = source.getDataSet().getQuadStore();
try (Stream<CursorQuad> quads = qs.getQuads(source.getSubjectUri(), TIM_HASINDEXERCONFIG, Direction.OUT, "")) {
final Map result = quads.findFirst().map(q -> {
try {
return objectMapper.readValue(q.getObject(), Map.class);
} catch (IOException e) {
LOG.error("Value not a Map", e);
return new HashMap<>();
}
}).orElse(new HashMap());
if (!result.containsKey("facet") || !(result.get("facet") instanceof List)) {
result.put("facet", new ArrayList<>());
}
if (!result.containsKey("fullText") || !(result.get("fullText") instanceof List)) {
result.put("fullText", new ArrayList<>());
}
return result;
}
}).dataFetcher("viewConfig", new ViewConfigFetcher(objectMapper)));
wiring.type("AboutMe", builder -> builder.dataFetcher("dataSets", env -> (Iterable) () -> dataSetRepository.getDataSetsWithWriteAccess(env.getSource()).stream().map(DataSetWithDatabase::new).iterator()).dataFetcher("dataSetMetadataList", env -> (Iterable) () -> {
Stream<DataSetWithDatabase> dataSets = dataSetRepository.getDataSets().stream().map(DataSetWithDatabase::new);
if (env.getArgument("ownOnly")) {
String userId = ((ContextData) env.getContext()).getUser().map(u -> "u" + u.getPersistentId()).orElse(null);
dataSets = dataSets.filter(d -> d.getOwnerId().equals(userId));
}
Permission permission = Permission.valueOf(env.getArgument("permission"));
if (permission != Permission.READ) {
// Read is implied
UserPermissionCheck check = ((ContextData) env.getContext()).getUserPermissionCheck();
dataSets = dataSets.filter(d -> check.getPermissions(d).contains(permission));
}
return dataSets.iterator();
}).dataFetcher("id", env -> ((User) env.getSource()).getPersistentId()).dataFetcher("name", env -> ((User) env.getSource()).getDisplayName()).dataFetcher("personalInfo", env -> "http://example.com").dataFetcher("canCreateDataSet", env -> true));
wiring.type("Mutation", builder -> builder.dataFetcher("setViewConfig", new ViewConfigMutation(dataSetRepository)).dataFetcher("setSummaryProperties", new SummaryPropsMutation(dataSetRepository)).dataFetcher("setIndexConfig", new IndexConfigMutation(dataSetRepository)).dataFetcher("createDataSet", new CreateDataSetMutation(dataSetRepository)).dataFetcher("deleteDataSet", new DeleteDataSetMutation(dataSetRepository)).dataFetcher("publish", new MakePublicMutation(dataSetRepository)).dataFetcher("extendSchema", new ExtendSchemaMutation(dataSetRepository)).dataFetcher("setDataSetMetadata", new DataSetMetadataMutation(dataSetRepository)).dataFetcher("setCollectionMetadata", new CollectionMetadataMutation(dataSetRepository)));
wiring.wiringFactory(wiringFactory);
StringBuilder root = new StringBuilder("type DataSets {\n sillyWorkaroundWhenNoDataSetsAreVisible: Boolean\n");
boolean[] dataSetAvailable = new boolean[] { false };
dataSetRepository.getDataSets().forEach(dataSet -> {
final DataSetMetaData dataSetMetaData = dataSet.getMetadata();
final String name = dataSetMetaData.getCombinedId();
Map<String, Type> types = dataSet.getSchemaStore().getStableTypes();
Map<String, List<ExplicitField>> customSchema = dataSet.getCustomSchema();
final Map<String, Type> customTypes = new HashMap<>();
for (Map.Entry<String, List<ExplicitField>> entry : customSchema.entrySet()) {
ExplicitType explicitType = new ExplicitType(entry.getKey(), entry.getValue());
customTypes.put(entry.getKey(), explicitType.convertToType());
}
Map<String, Type> mergedTypes;
MergeSchemas mergeSchemas = new MergeSchemas();
mergedTypes = mergeSchemas.mergeSchema(types, customTypes);
types = mergedTypes;
if (types != null) {
dataSetAvailable[0] = true;
root.append(" ").append(name).append(":").append(name).append(" @dataSet(userId:\"").append(dataSetMetaData.getOwnerId()).append("\", dataSetId:\"").append(dataSetMetaData.getDataSetId()).append("\")\n");
wiring.type(name, c -> c.dataFetcher("metadata", env -> new DataSetWithDatabase(dataSet)));
final String schema = typeGenerator.makeGraphQlTypes(name, types, dataSet.getTypeNameStore());
staticQuery.merge(schemaParser.parse(schema));
}
});
root.append("}\n\nextend type Query {\n #The actual dataSets\n dataSets: DataSets @passThrough\n}\n\n");
if (dataSetAvailable[0]) {
staticQuery.merge(schemaParser.parse(root.toString()));
}
SchemaGenerator schemaGenerator = new SchemaGenerator();
return schemaGenerator.makeExecutableSchema(staticQuery, wiring.build());
}
use of nl.knaw.huygens.timbuctoo.v5.datastores.schemastore.dto.ExplicitField in project timbuctoo by HuygensING.
the class MergeExplicitSchemasTest method mergeeExplicitSchemaMergesSchemasWithDifferentCollections.
@Test
public void mergeeExplicitSchemaMergesSchemasWithDifferentCollections() throws Exception {
Map<String, List<ExplicitField>> explicitSchema1 = new HashMap<>();
ExplicitField explicitField1 = new ExplicitField("test:test1", false, Sets.newHashSet("String"), null);
explicitSchema1.put("http://timbuctoo.huygens.knaw.nl/datasets/clusius/Places", Lists.newArrayList(explicitField1));
Map<String, List<ExplicitField>> explicitSchema2 = new HashMap<>();
ExplicitField explicitField2 = new ExplicitField("test:test2", false, null, Sets.newHashSet("String"));
explicitSchema2.put("http://timbuctoo.huygens.knaw.nl/datasets/clusius/Persons", Lists.newArrayList(explicitField2));
MergeExplicitSchemas mergeExplicitSchemas = new MergeExplicitSchemas();
Map<String, List<ExplicitField>> mergedExplicitSchema = mergeExplicitSchemas.mergeExplicitSchemas(explicitSchema1, explicitSchema2);
Map<String, List<ExplicitField>> expectedMergedSchema = new HashMap<>();
expectedMergedSchema.put("http://timbuctoo.huygens.knaw.nl/datasets/clusius/Places", Lists.newArrayList(explicitField1));
expectedMergedSchema.put("http://timbuctoo.huygens.knaw.nl/datasets/clusius/Persons", Lists.newArrayList(explicitField2));
assertThat(mergedExplicitSchema, is(expectedMergedSchema));
}
use of nl.knaw.huygens.timbuctoo.v5.datastores.schemastore.dto.ExplicitField in project timbuctoo by HuygensING.
the class ExtendSchemaMutation method get.
@Override
public Object get(DataFetchingEnvironment env) {
DataSet dataSet = MutationHelpers.getDataSet(env, dataSetRepository::getDataSet);
MutationHelpers.checkAdminPermissions(env, dataSet.getMetadata());
final SchemaStore generatedSchema = dataSet.getSchemaStore();
Map<String, Type> customTypes = new HashMap<>();
List<ExplicitType> customSchema;
Map<String, List<ExplicitField>> newCustomSchema = new HashMap<>();
try {
String customSchemaString = OBJECT_MAPPER.writeValueAsString(env.getArgument("customSchema"));
customSchema = OBJECT_MAPPER.readValue(customSchemaString, new TypeReference<List<ExplicitType>>() {
});
} catch (IOException e) {
throw new RuntimeException("Could not parse the schema input");
}
for (ExplicitType explicitType : customSchema) {
customTypes.put(explicitType.getCollectionId(), explicitType.convertToType());
newCustomSchema.put(explicitType.getCollectionId(), explicitType.getFields());
}
Map<String, List<ExplicitField>> existingCustomSchema = dataSet.getCustomSchema();
Map<String, Type> existingCustomSchemaTypes = new HashMap<>();
for (Map.Entry<String, List<ExplicitField>> entry : existingCustomSchema.entrySet()) {
ExplicitType tempExplicitType = new ExplicitType(entry.getKey(), entry.getValue());
existingCustomSchemaTypes.put(entry.getKey(), tempExplicitType.convertToType());
}
MergeSchemas mergeSchemas = new MergeSchemas();
customTypes = mergeSchemas.mergeSchema(existingCustomSchemaTypes, customTypes);
MergeExplicitSchemas mergeExplicitSchemas = new MergeExplicitSchemas();
Map<String, List<ExplicitField>> mergedExplicitSchema = mergeExplicitSchemas.mergeExplicitSchemas(existingCustomSchema, newCustomSchema);
try {
dataSet.saveCustomSchema(mergedExplicitSchema);
} catch (IOException e) {
LOG.error("Saving the custom schema failed", e);
throw new RuntimeException(e);
}
Map<String, Type> mergedSchema = mergeSchemas.mergeSchema(generatedSchema.getStableTypes(), customTypes);
for (Map.Entry<String, Type> customType : customTypes.entrySet()) {
if (!mergedSchema.containsKey(customType.getKey())) {
return ImmutableMap.of("message", "Schema extension was unsuccessful.");
}
}
return ImmutableMap.of("message", "Schema extended successfully.");
}
use of nl.knaw.huygens.timbuctoo.v5.datastores.schemastore.dto.ExplicitField in project timbuctoo by HuygensING.
the class MergeExplicitSchemas method mergeExplicitSchemas.
public Map<String, List<ExplicitField>> mergeExplicitSchemas(Map<String, List<ExplicitField>> explicitSchema1, Map<String, List<ExplicitField>> explicitSchema2) {
Map<String, List<ExplicitField>> mergedExplicitSchema = new HashMap<>();
for (Map.Entry<String, List<ExplicitField>> entry : explicitSchema1.entrySet()) {
mergedExplicitSchema.put(entry.getKey(), entry.getValue());
}
explicitSchema2.forEach((collection, values) -> {
if (mergedExplicitSchema.containsKey(collection)) {
List<ExplicitField> mergedValues = new ArrayList<>();
for (ExplicitField value : values) {
mergedValues.add(findAndMergeExplicitFields(collection, value, mergedExplicitSchema));
}
for (ExplicitField value : mergedExplicitSchema.get(collection)) {
boolean addValue = true;
for (ExplicitField mergedValue : mergedValues) {
if (mergedValue.getUri().equals(value.getUri())) {
addValue = false;
break;
}
}
if (addValue) {
mergedValues.add(value);
}
}
mergedExplicitSchema.put(collection, mergedValues);
} else {
mergedExplicitSchema.put(collection, values);
}
});
return mergedExplicitSchema;
}
use of nl.knaw.huygens.timbuctoo.v5.datastores.schemastore.dto.ExplicitField in project timbuctoo by HuygensING.
the class MergeExplicitSchemas method findAndMergeExplicitFields.
private ExplicitField findAndMergeExplicitFields(String collection, ExplicitField explicitField1, Map<String, List<ExplicitField>> explicitSchema) {
List<ExplicitField> explicitFields = explicitSchema.get(collection);
ExplicitField explicitField2 = null;
ExplicitField mergedField;
for (ExplicitField explicitField : explicitFields) {
if (explicitField.getUri().equals(explicitField1.getUri())) {
explicitField2 = explicitField;
break;
}
}
if (explicitField2 != null && explicitField1.getUri().equals(explicitField2.getUri())) {
mergedField = explicitField1.mergeWith(explicitField2);
} else {
mergedField = explicitField1;
}
return mergedField;
}
Aggregations