1 /*******************************************************************************
\r
2 * Copyright (c) 2015 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * Semantum Oy - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.db.indexing;
\r
14 import gnu.trove.map.hash.THashMap;
\r
16 import java.util.Collections;
\r
17 import java.util.EnumSet;
\r
18 import java.util.Map;
\r
20 import org.simantics.db.ReadGraph;
\r
21 import org.simantics.db.RequestProcessor;
\r
22 import org.simantics.db.Resource;
\r
23 import org.simantics.db.common.request.UniqueRead;
\r
24 import org.simantics.db.exception.DatabaseException;
\r
25 import org.simantics.db.exception.RuntimeDatabaseException;
\r
26 import org.simantics.db.layer0.adapter.GenericRelation;
\r
27 import org.simantics.utils.datastructures.Pair;
\r
30 * @author Tuukka Lehtonen
\r
31 * @since 1.20.0, 1.18.4
\r
35 public static enum Type {
\r
44 public static final EnumSet<Type> NUMERIC_TYPES = EnumSet.of(Type.INT, Type.LONG, Type.FLOAT, Type.DOUBLE);
\r
46 public final Pair<String, String>[] fields;
\r
47 public final Map<String, Type> typeMap;
\r
51 * @throws IllegalArgumentException
\r
52 * if any of the specified fields has an unsupported field type.
\r
53 * Supported field types are listed in enumeration {@link Type}.
\r
55 public IndexSchema(Pair<String, String>[] fields) {
\r
56 this.fields = fields;
\r
57 Map<String, Type> typeMap = new THashMap<>();
\r
58 for (Pair<String, String> field : fields) {
\r
59 Type type = parseType(field);
\r
60 typeMap.put(field.first, type);
\r
62 this.typeMap = Collections.unmodifiableMap(typeMap);
\r
65 public boolean hasField(String fieldName) {
\r
66 return typeMap.get(fieldName) != null;
\r
69 private static Type parseType(Pair<String, String> field) {
\r
70 switch (field.second) {
\r
71 case "Int": return Type.INT;
\r
72 case "Long": return Type.LONG;
\r
73 case "Float": return Type.FLOAT;
\r
74 case "Double": return Type.DOUBLE;
\r
75 case "String": return Type.STRING;
\r
76 case "Text": return Type.TEXT;
\r
78 throw new IllegalArgumentException("Unrecognized index field type '" + field.second + "' for field '" + field.first + "'");
\r
82 public static IndexSchema readFromRelation(RequestProcessor processor, final Resource relation) {
\r
84 return processor.syncRequest(new UniqueRead<IndexSchema>() {
\r
86 public IndexSchema perform(ReadGraph graph) throws DatabaseException {
\r
87 return readFromRelation(graph, relation);
\r
90 } catch (DatabaseException e) {
\r
91 throw new RuntimeDatabaseException(e);
\r
95 public static IndexSchema readFromRelation(ReadGraph graph, Resource relation) throws DatabaseException {
\r
97 GenericRelation r = graph.adapt(relation, GenericRelation.class);
\r
98 return new IndexSchema( r.getFields() );
\r
99 } catch (IllegalArgumentException e) {
\r
100 throw new DatabaseException(
\r
101 "Failed to read index schema for relation " + relation + ". See cause for reason.", e);
\r