@SuppressWarnings("OptionalGetWithoutIsPresent") static GlobalUniqueIndex createGlobalUniqueIndex(SqlgGraph sqlgGraph, Topology topology, String globalUniqueIndexName, Set<PropertyColumn> properties) { //all PropertyColumns must be for the same PropertyType PropertyType propertyType = properties.iterator().next().getPropertyType(); Map<String, PropertyType> valueColumn = new HashMap<>(); valueColumn.put(GLOBAL_UNIQUE_INDEX_RECORD_ID, PropertyType.STRING); valueColumn.put(GLOBAL_UNIQUE_INDEX_PROPERTY_NAME, PropertyType.STRING); valueColumn.put(GLOBAL_UNIQUE_INDEX_VALUE, propertyType); VertexLabel vertexLabel = topology.getGlobalUniqueIndexSchema().ensureVertexLabelExist(globalUniqueIndexName, valueColumn); PropertyColumn valuePropertyColumn = vertexLabel.getProperty(GLOBAL_UNIQUE_INDEX_VALUE).get(); PropertyColumn recordIdColumn = vertexLabel.getProperty(GLOBAL_UNIQUE_INDEX_RECORD_ID).get(); PropertyColumn propertyColumn = vertexLabel.getProperty(GLOBAL_UNIQUE_INDEX_PROPERTY_NAME).get(); vertexLabel.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(valuePropertyColumn)); vertexLabel.ensureIndexExists(IndexType.UNIQUE, Arrays.asList(recordIdColumn, propertyColumn)); GlobalUniqueIndex globalUniqueIndex = new GlobalUniqueIndex(topology, globalUniqueIndexName, properties); topology.getGlobalUniqueIndexSchema().globalUniqueIndexes.put(globalUniqueIndex.getName(),globalUniqueIndex); TopologyManager.addGlobalUniqueIndex(sqlgGraph, globalUniqueIndexName, properties); globalUniqueIndex.committed = false; return globalUniqueIndex; }
void ensureVertexColumnsExist(String label, Map<String, PropertyType> columns) { Preconditions.checkArgument(!label.startsWith(VERTEX_PREFIX), "label may not start with \"%s\"", VERTEX_PREFIX); Preconditions.checkState(!isSqlgSchema(), "Schema.ensureVertexLabelPropertiesExist may not be called for \"%s\"", SQLG_SCHEMA); Optional<VertexLabel> vertexLabel = getVertexLabel(label); Preconditions.checkState(vertexLabel.isPresent(), "BUG: vertexLabel \"%s\" must exist", label); //noinspection OptionalGetWithoutIsPresent vertexLabel.get().ensurePropertiesExist(columns); }
default String drop(VertexLabel vertexLabel, Collection<RecordId.ID> ids) { StringBuilder sql = new StringBuilder(); sql.append("DELETE FROM\n\t"); sql.append(maybeWrapInQoutes(vertexLabel.getSchema().getName())); sql.append("."); sql.append(maybeWrapInQoutes(Topology.VERTEX_PREFIX + vertexLabel.getName())); sql.append(" WHERE "); if (vertexLabel.hasIDPrimaryKey()) { sql.append(maybeWrapInQoutes("ID")); } else { int cnt = 1; sql.append("("); for (String identifier : vertexLabel.getIdentifiers()) { sql.append(maybeWrapInQoutes(identifier)); if (cnt++ < vertexLabel.getIdentifiers().size()) { sql.append(","); int count = 1; for (RecordId.ID id : ids) { if (vertexLabel.hasIDPrimaryKey()) { sql.append(id.getSequenceId()); if (count++ < ids.size()) {
private void buildQuestionMark(StringBuilder sql, VertexLabel vertexLabel) { if (vertexLabel.getIdentifiers().isEmpty()) { sql.append("?"); } else { for (String identifier : vertexLabel.getIdentifiers()) { if (!vertexLabel.isDistributed() || !vertexLabel.getDistributionPropertyColumn().getName().equals(identifier)) { sql.append("?, "); } } //remove the extra comma sql.delete(sql.length() - 2, sql.length()); } }
@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; }
SchemaTable schemaTable = SchemaTable.of(vertexLabel.getSchema().getName(), VERTEX_PREFIX + vertexLabel.getLabel()); this.schemaTableForeignKeyCache.remove(schemaTable); this.allTableCache.remove(schemaTable.toString()); if (vertexLabel.hasIDPrimaryKey()) { foreignKey = ForeignKey.of(vertexLabel.getFullName() + OUT_VERTEX_COLUMN_END); } else { foreignKey = new ForeignKey(); for (String identifier : vertexLabel.getIdentifiers()) { foreignKey.add(vertexLabel.getFullName() + "." + identifier + OUT_VERTEX_COLUMN_END); for (EdgeLabel lbl : vertexLabel.getOutEdgeLabels().values()) { removeFromEdgeForeignKeyCache( lbl.getSchema().getName() + "." + EDGE_PREFIX + lbl.getLabel(), if (vertexLabel.hasIDPrimaryKey()) { foreignKey = ForeignKey.of(vertexLabel.getFullName() + IN_VERTEX_COLUMN_END); } else { foreignKey = new ForeignKey(); for (String identifier : vertexLabel.getIdentifiers()) { foreignKey.add(vertexLabel.getFullName() + "." + identifier + IN_VERTEX_COLUMN_END); for (EdgeLabel lbl : vertexLabel.getInEdgeLabels().values()) { if (lbl.isValid()) { removeFromEdgeForeignKeyCache(
String schema = outVertexLabel.getSchema().getName(); String tableName = EDGE_PREFIX + getLabel(); if (inVertexLabel.hasIDPrimaryKey()) { sql.append("\n\t"); sql.append(sqlDialect.maybeWrapInQoutes(inVertexLabel.getFullName() + Topology.IN_VERTEX_COLUMN_END)); sql.append(" "); sql.append(sqlDialect.getForeignKeyTypeDefinition()); sql.append("\n\t"); int i = 1; for (String identifier : inVertexLabel.getIdentifiers()) { PropertyColumn propertyColumn = inVertexLabel.getProperty(identifier).orElseThrow( () -> new IllegalStateException(String.format("identifier %s column must be a property", identifier)) ); if (outVertexLabel.isDistributed() && outVertexLabel.getDistributionPropertyColumn().getName().equals(identifier)) { i++; } else { for (String sqlDefinition : propertyTypeToSqlDefinition) { if (count > 1) { sql.append(sqlgGraph.getSqlDialect().maybeWrapInQoutes(inVertexLabel.getFullName() + "." + identifier + propertyType.getPostFixes()[count - 2] + Topology.IN_VERTEX_COLUMN_END)).append(" ").append(sqlDefinition); } else { sql.append(sqlgGraph.getSqlDialect().maybeWrapInQoutes(inVertexLabel.getFullName() + "." + identifier + Topology.IN_VERTEX_COLUMN_END)).append(" ").append(sqlDefinition); if (outVertexLabel.isDistributed()) { if (i++ < inVertexLabel.getIdentifiers().size() - 1) { sql.append(", ");
for (VertexLabel vertexLabel : this.uncommittedInVertexLabels) { if (!this.uncommittedRemovedInVertexLabels.contains(vertexLabel)) { if (vertexLabel.hasIDPrimaryKey()) { result.add(ForeignKey.of(vertexLabel.getFullName() + Topology.IN_VERTEX_COLUMN_END)); } else { ForeignKey foreignKey = new ForeignKey(); for (String identifier : vertexLabel.getIdentifiers()) { if (!vertexLabel.isDistributed() || !vertexLabel.getDistributionPropertyColumn().getName().equals(identifier)) { foreignKey.add(vertexLabel.getFullName() + "." + identifier + Topology.IN_VERTEX_COLUMN_END); if (vertexLabel.hasIDPrimaryKey()) { result.add(ForeignKey.of(vertexLabel.getFullName() + Topology.OUT_VERTEX_COLUMN_END)); } else { ForeignKey foreignKey = new ForeignKey(); for (String identifier : vertexLabel.getIdentifiers()) { if (!vertexLabel.isDistributed() || !vertexLabel.getDistributionPropertyColumn().getName().equals(identifier)) { foreignKey.add(vertexLabel.getFullName() + "." + identifier + Topology.OUT_VERTEX_COLUMN_END);
for (Map.Entry<String, EdgeLabel> edgeLabelEntry : lastVertexLabel.getOutEdgeLabels().entrySet()) { EdgeLabel edgeLabel = edgeLabelEntry.getValue(); if (!edgeLabel.equals(lastEdgeLabel)) { sb.append(maybeWrapInQoutes(Topology.EDGE_PREFIX + edgeLabel.getName())); sb.append("\nWHERE "); sb.append(maybeWrapInQoutes(lastVertexLabel.getSchema().getName() + "." + lastVertexLabel.getName() + Topology.OUT_VERTEX_COLUMN_END)); sb.append(" IN("); sb.append(leafElementsToDelete); for (Map.Entry<String, EdgeLabel> edgeLabelEntry : lastVertexLabel.getInEdgeLabels().entrySet()) { EdgeLabel edgeLabel = edgeLabelEntry.getValue(); if (!edgeLabel.equals(lastEdgeLabel)) { sb.append(maybeWrapInQoutes(Topology.EDGE_PREFIX + edgeLabel.getName())); sb.append("\nWHERE "); sb.append(maybeWrapInQoutes(lastVertexLabel.getSchema().getName() + "." + lastVertexLabel.getName() + Topology.IN_VERTEX_COLUMN_END)); sb.append(" IN\n\t("); sb.append(leafElementsToDelete);
EdgeLabel schemaToVertexEdgeLabel = schemaVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE, vertexVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(schemaToVertexEdgeLabel); EdgeLabel vertexInEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_IN_EDGES_EDGE, edgeVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(vertexInEdgeLabel); EdgeLabel vertexOutEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_OUT_EDGES_EDGE, edgeVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(vertexOutEdgeLabel); EdgeLabel vertexPartitionEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_VERTEX_PARTITION_EDGE, partitionVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(vertexPartitionEdgeLabel); EdgeLabel edgePartitionEdgeLabel = edgeVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_EDGE_PARTITION_EDGE, partitionVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(edgePartitionEdgeLabel); EdgeLabel partitionPartitionEdgeLabel = partitionVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_PARTITION_PARTITION_EDGE, partitionVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(partitionPartitionEdgeLabel); EdgeLabel vertexDistributionPropertyColumnEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_VERTEX_DISTRIBUTION_COLUMN_EDGE, propertyVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(vertexDistributionPropertyColumnEdgeLabel); EdgeLabel vertexColocatePropertyColumnEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_VERTEX_DISTRIBUTION_COLOCATE_EDGE, vertexVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(vertexColocatePropertyColumnEdgeLabel); EdgeLabel edgeDistributionPropertyColumnEdgeLabel = edgeVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_EDGE_DISTRIBUTION_COLUMN_EDGE, propertyVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(edgeDistributionPropertyColumnEdgeLabel); EdgeLabel edgeColocatePropertyColumnEdgeLabel = edgeVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_EDGE_DISTRIBUTION_COLOCATE_EDGE, vertexVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(edgeColocatePropertyColumnEdgeLabel); EdgeLabel vertexPropertyEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE, propertyVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(vertexPropertyEdgeLabel); EdgeLabel edgePropertyEdgeLabel = edgeVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_EDGE_PROPERTIES_EDGE, propertyVertexLabel, columns); this.sqlgSchemaAbstractLabels.add(edgePropertyEdgeLabel); EdgeLabel vertexIdentifierEdgeLabel = vertexVertexLabel.loadSqlgSchemaEdgeLabel(SQLG_SCHEMA_VERTEX_IDENTIFIER_EDGE, propertyVertexLabel, columns);
.getSchema(schemaTable.getSchema()).orElseThrow(() -> new IllegalStateException(String.format("Schema %s not found", schemaTable.getSchema()))) .getVertexLabel(schemaTable.getTable()).orElseThrow(() -> new IllegalStateException(String.format("VertexLabel %s not found", schemaTable.getTable()))); Map<String, PropertyColumn> propertyColumns = vertexLabel.getProperties(); if (!columns.isEmpty()) { Map<String, PropertyType> propertyTypeMap = new HashMap<>(); if (vertexLabel.hasIDPrimaryKey()) { sql.append(sqlgGraph.getSqlDialect().maybeWrapInQoutes(Topology.ID)); sql.append(" = ?"); } else { for (String identifier : vertexLabel.getIdentifiers()) { sql.append(sqlgGraph.getSqlDialect().maybeWrapInQoutes(identifier)); sql.append(" = ?");
private boolean hasNoEdgeLabels(SchemaTable schemaTable) { Optional<Schema> schemaOptional = sqlgGraph.getTopology().getSchema(schemaTable.getSchema()); Preconditions.checkState(schemaOptional.isPresent(), "BUG: %s not found in the topology.", schemaTable.getSchema()); Schema schema = schemaOptional.get(); boolean result = true; if (schemaTable.isVertexTable()) { //Need to delete any in/out edges. Optional<VertexLabel> vertexLabelOptional = schema.getVertexLabel(schemaTable.withOutPrefix().getTable()); Preconditions.checkState(vertexLabelOptional.isPresent(), "BUG: %s not found in the topology.", schemaTable.withOutPrefix().getTable()); VertexLabel vertexLabel = vertexLabelOptional.get(); Collection<EdgeLabel> outEdgeLabels = vertexLabel.getOutEdgeLabels().values(); Collection<EdgeLabel> inEdgeLabels = vertexLabel.getInEdgeLabels().values(); result = outEdgeLabels.isEmpty() && inEdgeLabels.isEmpty(); } return result; }
if (inVertexLabel.getIdentifiers().isEmpty()) { sql.append(this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.inVertex.schema + "." + this.inVertex.table + Topology.IN_VERTEX_COLUMN_END)); } else { int i = 1; for (String identifier : inVertexLabel.getIdentifiers()) { if (outVertexLabel.isDistributed() && outVertexLabel.getDistributionPropertyColumn().getName().equals(identifier)) { i++; } else { sql.append(this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.inVertex.schema + "." + this.inVertex.table + "." + identifier + Topology.IN_VERTEX_COLUMN_END)); if (outVertexLabel.isDistributed()) { if (i++ < inVertexLabel.getIdentifiers().size() - 1) { sql.append(", "); if (i++ < inVertexLabel.getIdentifiers().size()) { sql.append(", "); if (outVertexLabel.getIdentifiers().isEmpty()) { sql.append(this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.outVertex.schema + "." + this.outVertex.table + Topology.OUT_VERTEX_COLUMN_END)); } else { int i = 1; for (String identifier : outVertexLabel.getIdentifiers()) { if (outVertexLabel.isDistributed() && outVertexLabel.getDistributionPropertyColumn().getName().equals(identifier)) { i++; } else { sql.append(this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(this.outVertex.schema + "." + this.outVertex.table + "." + identifier + Topology.OUT_VERTEX_COLUMN_END)); if (outVertexLabel.isDistributed()) { if (i++ < inVertexLabel.getIdentifiers().size() - 1) { sql.append(", ");
int i = addMetaData(bulkCopy, sqlgGraph); if (inVertexLabel.hasIDPrimaryKey()) { bulkCopy.addColumnMapping(i, metaEdge.getInLabel() + Topology.IN_VERTEX_COLUMN_END); this.columnMetadata.put(i++, new ColumnMetadata( )); } else { for (String identifier : inVertexLabel.getIdentifiers()) { bulkCopy.addColumnMapping(i, metaEdge.getInLabel() + "." + identifier + Topology.IN_VERTEX_COLUMN_END); PropertyType propertyType = inVertexLabel.getProperty(identifier).orElseThrow(() -> new IllegalStateException(String.format("BUG: Did not find the identifier property %s.", identifier))).getPropertyType(); this.columnMetadata.put(i++, new ColumnMetadata( metaEdge.getInLabel() + "." + identifier + Topology.IN_VERTEX_COLUMN_END, if (outVertexLabel.hasIDPrimaryKey()) { bulkCopy.addColumnMapping(i, metaEdge.getOutLabel() + Topology.OUT_VERTEX_COLUMN_END); this.columnMetadata.put(i++, new ColumnMetadata( )); } else { for (String identifier : outVertexLabel.getIdentifiers()) { PropertyType propertyType = outVertexLabel.getProperty(identifier).orElseThrow(() -> new IllegalStateException(String.format("BUG: Did not find the identifier property %s.", identifier))).getPropertyType(); bulkCopy.addColumnMapping(i, metaEdge.getOutLabel() + "." + identifier + Topology.OUT_VERTEX_COLUMN_END); this.columnMetadata.put(i++, new ColumnMetadata(
this.outEdgeLabels.put(edgeLabelName, edgeLabel); edgeLabel.afterCommit(); this.getSchema().addToAllEdgeCache(edgeLabel); edgeLabelEntryIter.remove(); if (lbl != null) { ForeignKey foreignKey; if (hasIDPrimaryKey()) { foreignKey = ForeignKey.of(this.getFullName() + Topology.OUT_VERTEX_COLUMN_END); } else { foreignKey = new ForeignKey(); for (String identifier : this.getIdentifiers()) { foreignKey.add(this.getFullName() + "." + identifier + Topology.OUT_VERTEX_COLUMN_END); this.getSchema().getTopology().removeFromEdgeForeignKeyCache( lbl.getSchema().getName() + "." + EDGE_PREFIX + lbl.getLabel(), foreignKey); this.getSchema().getTopology().removeOutForeignKeysFromVertexLabel(this, lbl); if (lbl != null) { ForeignKey foreignKey; if (this.hasIDPrimaryKey()) { foreignKey = ForeignKey.of(this.getFullName() + Topology.IN_VERTEX_COLUMN_END); } else { foreignKey = new ForeignKey(); for (String identifier : this.getIdentifiers()) { foreignKey.add(this.getFullName() + "." + identifier + Topology.IN_VERTEX_COLUMN_END); this.getSchema().getTopology().removeFromEdgeForeignKeyCache(
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); } } } } }
@Override public Schema getSchema() { if (!this.outVertexLabels.isEmpty()) { VertexLabel vertexLabel = this.outVertexLabels.iterator().next(); return vertexLabel.getSchema(); } else if (this.topology.isSqlWriteLockHeldByCurrentThread() && !this.uncommittedOutVertexLabels.isEmpty()) { VertexLabel vertexLabel = this.uncommittedOutVertexLabels.iterator().next(); return vertexLabel.getSchema(); } else { throw new IllegalStateException("BUG: no outVertexLabels present when getSchema() is called"); } }
/** * remove a given vertex label * * @param vertexLabel the vertex label * @param preserveData should we keep the SQL data */ void removeVertexLabel(VertexLabel vertexLabel, boolean preserveData) { getTopology().lock(); String fn = this.name + "." + VERTEX_PREFIX + vertexLabel.getName(); if (!uncommittedRemovedVertexLabels.contains(fn)) { uncommittedRemovedVertexLabels.add(fn); TopologyManager.removeVertexLabel(this.sqlgGraph, vertexLabel); for (EdgeRole er : vertexLabel.getOutEdgeRoles().values()) { er.remove(preserveData); } for (EdgeRole er : vertexLabel.getInEdgeRoles().values()) { er.remove(preserveData); } if (!preserveData) { vertexLabel.delete(); } getTopology().fire(vertexLabel, "", TopologyChangeAction.DELETE); } }
VertexLabel vertexLabel = this.vertexLabels.get(schemaName + "." + VERTEX_PREFIX + tableName); if (vertexLabel == null) { vertexLabel = new VertexLabel(this, tableName); this.vertexLabels.put(schemaName + "." + VERTEX_PREFIX + tableName, vertexLabel); Optional<Index> oidx = vertexLabel.getIndex(indexName); Index idx; if (oidx.isPresent()) { } else { idx = new Index(indexName, IndexType.fromString(vertexIndex.value(SQLG_SCHEMA_INDEX_INDEX_TYPE)), vertexLabel); vertexLabel.addIndex(idx); vertexLabel.getProperty(propertyName).ifPresent((PropertyColumn pc) -> idx.addProperty(pc));
sql.append("\nWHERE\n\t"); if (vertexLabel.hasIDPrimaryKey()) { sql.append(this.sqlgGraph.getSqlDialect().maybeWrapInQoutes("ID")); sql.append(" = ?"); } else { int count = 1; for (String identifier : vertexLabel.getIdentifiers()) { sql.append(this.sqlgGraph.getSqlDialect().maybeWrapInQoutes(identifier)); sql.append(" = ?"); if (count++ < vertexLabel.getIdentifiers().size()) { sql.append(" AND "); if (vertexLabel.hasIDPrimaryKey()) { preparedStatement.setLong(1, this.recordId.sequenceId()); } else {