@Override public int hashCode() { return (this.schema.getName() + this.getLabel()).hashCode(); }
@Override public int hashCode() { return (this.schema.getName() + this.getLabel()).hashCode(); }
Map<SchemaTable, Pair<Set<SchemaTable>, Set<SchemaTable>>> getUncommittedSchemaTableForeignKeys() { Preconditions.checkState(getTopology().isSqlWriteLockHeldByCurrentThread(), "Schema.getUncommittedSchemaTableForeignKeys must be called with the lock held"); Map<SchemaTable, Pair<Set<SchemaTable>, Set<SchemaTable>>> result = new HashMap<>(); for (Map.Entry<String, VertexLabel> vertexLabelEntry : this.vertexLabels.entrySet()) { String vertexQualifiedName = this.name + "." + VERTEX_PREFIX + vertexLabelEntry.getValue().getLabel(); SchemaTable schemaTable = SchemaTable.from(this.sqlgGraph, vertexQualifiedName); Pair<Set<SchemaTable>, Set<SchemaTable>> uncommittedSchemaTableForeignKeys = vertexLabelEntry.getValue().getUncommittedSchemaTableForeignKeys(); if (!uncommittedSchemaTableForeignKeys.getLeft().isEmpty() || !uncommittedSchemaTableForeignKeys.getRight().isEmpty()) { result.put(schemaTable, uncommittedSchemaTableForeignKeys); } } for (Map.Entry<String, VertexLabel> uncommittedVertexLabelEntry : this.uncommittedVertexLabels.entrySet()) { String vertexQualifiedName = this.name + "." + VERTEX_PREFIX + uncommittedVertexLabelEntry.getValue().getLabel(); SchemaTable schemaTable = SchemaTable.from(this.sqlgGraph, vertexQualifiedName); Pair<Set<SchemaTable>, Set<SchemaTable>> uncommittedSchemaTableForeignKeys = uncommittedVertexLabelEntry.getValue().getUncommittedSchemaTableForeignKeys(); result.put(schemaTable, uncommittedSchemaTableForeignKeys); } return result; }
Map<SchemaTable, Pair<Set<SchemaTable>, Set<SchemaTable>>> getUncommittedSchemaTableForeignKeys() { Preconditions.checkState(getTopology().isSqlWriteLockHeldByCurrentThread(), "Schema.getUncommittedSchemaTableForeignKeys must be called with the lock held"); Map<SchemaTable, Pair<Set<SchemaTable>, Set<SchemaTable>>> result = new HashMap<>(); for (Map.Entry<String, VertexLabel> vertexLabelEntry : this.vertexLabels.entrySet()) { String vertexQualifiedName = this.name + "." + VERTEX_PREFIX + vertexLabelEntry.getValue().getLabel(); SchemaTable schemaTable = SchemaTable.from(this.sqlgGraph, vertexQualifiedName); Pair<Set<SchemaTable>, Set<SchemaTable>> uncommittedSchemaTableForeignKeys = vertexLabelEntry.getValue().getUncommittedSchemaTableForeignKeys(); if (!uncommittedSchemaTableForeignKeys.getLeft().isEmpty() || !uncommittedSchemaTableForeignKeys.getRight().isEmpty()) { result.put(schemaTable, uncommittedSchemaTableForeignKeys); } } for (Map.Entry<String, VertexLabel> uncommittedVertexLabelEntry : this.uncommittedVertexLabels.entrySet()) { String vertexQualifiedName = this.name + "." + VERTEX_PREFIX + uncommittedVertexLabelEntry.getValue().getLabel(); SchemaTable schemaTable = SchemaTable.from(this.sqlgGraph, vertexQualifiedName); Pair<Set<SchemaTable>, Set<SchemaTable>> uncommittedSchemaTableForeignKeys = uncommittedVertexLabelEntry.getValue().getUncommittedSchemaTableForeignKeys(); result.put(schemaTable, uncommittedSchemaTableForeignKeys); } return result; }
Map<String, Map<String, PropertyType>> getAllTables() { Map<String, Map<String, PropertyType>> result = new HashMap<>(); for (Map.Entry<String, VertexLabel> vertexLabelEntry : this.vertexLabels.entrySet()) { String vertexQualifiedName = this.name + "." + VERTEX_PREFIX + vertexLabelEntry.getValue().getLabel(); result.put(vertexQualifiedName, vertexLabelEntry.getValue().getPropertyTypeMap()); } if (this.topology.isSqlWriteLockHeldByCurrentThread()) { for (Map.Entry<String, VertexLabel> vertexLabelEntry : this.uncommittedVertexLabels.entrySet()) { String vertexQualifiedName = vertexLabelEntry.getKey(); VertexLabel vertexLabel = vertexLabelEntry.getValue(); result.put(vertexQualifiedName, vertexLabel.getPropertyTypeMap()); } } for (EdgeLabel edgeLabel : this.getEdgeLabels().values()) { String edgeQualifiedName = this.name + "." + EDGE_PREFIX + edgeLabel.getLabel(); result.put(edgeQualifiedName, edgeLabel.getPropertyTypeMap()); } return result; }
Map<String, Map<String, PropertyType>> getAllTables() { Map<String, Map<String, PropertyType>> result = new HashMap<>(); for (Map.Entry<String, VertexLabel> vertexLabelEntry : this.vertexLabels.entrySet()) { String vertexQualifiedName = this.name + "." + VERTEX_PREFIX + vertexLabelEntry.getValue().getLabel(); result.put(vertexQualifiedName, vertexLabelEntry.getValue().getPropertyTypeMap()); } if (this.topology.isSqlWriteLockHeldByCurrentThread()) { for (Map.Entry<String, VertexLabel> vertexLabelEntry : this.uncommittedVertexLabels.entrySet()) { String vertexQualifiedName = vertexLabelEntry.getKey(); VertexLabel vertexLabel = vertexLabelEntry.getValue(); result.put(vertexQualifiedName, vertexLabel.getPropertyTypeMap()); } } for (EdgeLabel edgeLabel : this.getEdgeLabels().values()) { String edgeQualifiedName = this.name + "." + EDGE_PREFIX + edgeLabel.getLabel(); result.put(edgeQualifiedName, edgeLabel.getPropertyTypeMap()); } return result; }
public void ensurePropertiesExist(Map<String, PropertyType> columns) { for (Map.Entry<String, PropertyType> column : columns.entrySet()) { if (!this.properties.containsKey(column.getKey())) { Preconditions.checkState(!this.schema.isSqlgSchema(), "schema may not be %s", SQLG_SCHEMA); if (!this.uncommittedProperties.containsKey(column.getKey())) { this.schema.getTopology().lock(); if (!getProperty(column.getKey()).isPresent()) { TopologyManager.addVertexColumn(this.sqlgGraph, this.schema.getName(), VERTEX_PREFIX + getLabel(), column); addColumn(this.schema.getName(), VERTEX_PREFIX + getLabel(), ImmutablePair.of(column.getKey(), column.getValue())); PropertyColumn propertyColumn = new PropertyColumn(this, column.getKey(), column.getValue()); propertyColumn.setCommitted(false); this.uncommittedProperties.put(column.getKey(), propertyColumn); this.getSchema().getTopology().fire(propertyColumn, "", TopologyChangeAction.CREATE); } } } } }
/** * add in foreign key between a vertex label and a edge label * * @param vertexLabel * @param edgeLabel */ void addInForeignKeysToVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.computeIfAbsent( schemaTable, k -> Pair.of(new HashSet<>(), new HashSet<>()) ); foreignKeys.getLeft().add(SchemaTable.of(edgeLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); }
public void ensurePropertiesExist(Map<String, PropertyType> columns) { for (Map.Entry<String, PropertyType> column : columns.entrySet()) { if (!this.properties.containsKey(column.getKey())) { Preconditions.checkState(!this.schema.isSqlgSchema(), "schema may not be %s", SQLG_SCHEMA); if (!this.uncommittedProperties.containsKey(column.getKey())) { this.schema.getTopology().lock(); if (!getProperty(column.getKey()).isPresent()) { TopologyManager.addVertexColumn(this.sqlgGraph, this.schema.getName(), VERTEX_PREFIX + getLabel(), column); addColumn(this.schema.getName(), VERTEX_PREFIX + getLabel(), ImmutablePair.of(column.getKey(), column.getValue())); PropertyColumn propertyColumn = new PropertyColumn(this, column.getKey(), column.getValue()); propertyColumn.setCommitted(false); this.uncommittedProperties.put(column.getKey(), propertyColumn); this.getSchema().getTopology().fire(propertyColumn, "", TopologyChangeAction.CREATE); } } } } }
/** * add out foreign key between a vertex label and a edge label * * @param vertexLabel * @param edgeLabel */ void addOutForeignKeysToVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.computeIfAbsent( schemaTable, k -> Pair.of(new HashSet<>(), new HashSet<>()) ); foreignKeys.getRight().add(SchemaTable.of(vertexLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); }
/** * add out foreign key between a vertex label and a edge label * * @param vertexLabel * @param edgeLabel */ void addOutForeignKeysToVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.computeIfAbsent( schemaTable, k -> Pair.of(new HashSet<>(), new HashSet<>()) ); foreignKeys.getRight().add(SchemaTable.of(vertexLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); }
/** * add in foreign key between a vertex label and a edge label * * @param vertexLabel * @param edgeLabel */ void addInForeignKeysToVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.computeIfAbsent( schemaTable, k -> Pair.of(new HashSet<>(), new HashSet<>()) ); foreignKeys.getLeft().add(SchemaTable.of(edgeLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); }
@Override public List<Topology.TopologyValidationError> validateTopology(DatabaseMetaData metadata) throws SQLException { List<Topology.TopologyValidationError> validationErrors = new ArrayList<>(); for (PropertyColumn propertyColumn : getProperties().values()) { List<Triple<String, Integer, String>> columns = this.sqlgGraph.getSqlDialect().getTableColumns(metadata, null, this.getSchema().getName(), "V_" + this.getLabel(), propertyColumn.getName()); if (columns.isEmpty()) { validationErrors.add(new Topology.TopologyValidationError(propertyColumn)); } // try (ResultSet propertyRs = metadata.getColumns(null, this.getSchema().getName(), "V_" + this.getLabel(), propertyColumn.getName())) { // if (!propertyRs.next()) { // validationErrors.add(new Topology.TopologyValidationError(propertyColumn)); // } // } } for (Index index : getIndexes().values()) { validationErrors.addAll(index.validateTopology(metadata)); } return validationErrors; }
@Override public List<Topology.TopologyValidationError> validateTopology(DatabaseMetaData metadata) throws SQLException { List<Topology.TopologyValidationError> validationErrors = new ArrayList<>(); for (PropertyColumn propertyColumn : getProperties().values()) { List<Triple<String, Integer, String>> columns = this.sqlgGraph.getSqlDialect().getTableColumns(metadata, null, this.getSchema().getName(), "V_" + this.getLabel(), propertyColumn.getName()); if (columns.isEmpty()) { validationErrors.add(new Topology.TopologyValidationError(propertyColumn)); } // try (ResultSet propertyRs = metadata.getColumns(null, this.getSchema().getName(), "V_" + this.getLabel(), propertyColumn.getName())) { // if (!propertyRs.next()) { // validationErrors.add(new Topology.TopologyValidationError(propertyColumn)); // } // } } for (Index index : getIndexes().values()) { validationErrors.addAll(index.validateTopology(metadata)); } return validationErrors; }
/** * remove out foreign key for a given vertex label and edge label * * @param vertexLabel * @param edgeLabel */ void removeOutForeignKeysFromVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.get(schemaTable); if (foreignKeys != null) { foreignKeys.getRight().remove(SchemaTable.of(vertexLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); } }
/** * remove out foreign key for a given vertex label and edge label * * @param vertexLabel * @param edgeLabel */ void removeOutForeignKeysFromVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.get(schemaTable); if (foreignKeys != null) { foreignKeys.getRight().remove(SchemaTable.of(vertexLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); } }
/** * remove in foreign key for a given vertex label and edge label * * @param vertexLabel * @param edgeLabel */ void removeInForeignKeysFromVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.get(schemaTable); if (foreignKeys != null && edgeLabel.isValid()) { foreignKeys.getLeft().remove(SchemaTable.of(edgeLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); } }
/** * remove in foreign key for a given vertex label and edge label * * @param vertexLabel * @param edgeLabel */ void removeInForeignKeysFromVertexLabel(VertexLabel vertexLabel, EdgeLabel edgeLabel) { Preconditions.checkState(isSqlWriteLockHeldByCurrentThread() || isTopologyMapWriteLockHeldByCurrentThread()); SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); Pair<Set<SchemaTable>, Set<SchemaTable>> foreignKeys = this.schemaTableForeignKeyCache.get(schemaTable); if (foreignKeys != null && edgeLabel.isValid()) { foreignKeys.getLeft().remove(SchemaTable.of(edgeLabel.getSchema().getName(), EDGE_PREFIX + edgeLabel.getLabel())); } }
@Override void removeProperty(PropertyColumn propertyColumn, boolean preserveData) { this.getSchema().getTopology().lock(); if (!uncommittedRemovedProperties.contains(propertyColumn.getName())) { uncommittedRemovedProperties.add(propertyColumn.getName()); TopologyManager.removeVertexColumn(this.sqlgGraph, this.schema.getName(), VERTEX_PREFIX + getLabel(), propertyColumn.getName()); if (!preserveData) { removeColumn(this.schema.getName(), VERTEX_PREFIX + getLabel(), propertyColumn.getName()); } this.getSchema().getTopology().fire(propertyColumn, "", TopologyChangeAction.DELETE); } }
@Override void removeProperty(PropertyColumn propertyColumn, boolean preserveData) { this.getSchema().getTopology().lock(); if (!uncommittedRemovedProperties.contains(propertyColumn.getName())) { uncommittedRemovedProperties.add(propertyColumn.getName()); TopologyManager.removeVertexColumn(this.sqlgGraph, this.schema.getName(), VERTEX_PREFIX + getLabel(), propertyColumn.getName()); if (!preserveData) { removeColumn(this.schema.getName(), VERTEX_PREFIX + getLabel(), propertyColumn.getName()); } this.getSchema().getTopology().fire(propertyColumn, "", TopologyChangeAction.DELETE); } }