Search in sources :

Example 1 with PropertyDef

use of com.alibaba.maxgraph.sdkcommon.schema.PropertyDef in project GraphScope by alibaba.

the class AbstractCreateTypeExecutor method execute.

@Override
public DdlResult execute(ByteString ddlBlob, GraphDef graphDef, int partitionCount) throws InvalidProtocolBufferException {
    TypeDefPb typeDefPb = TypeDefPb.parseFrom(ddlBlob);
    TypeDef typeDef = TypeDef.parseProto(typeDefPb);
    long version = graphDef.getSchemaVersion();
    String label = typeDef.getLabel();
    if (!label.matches(NAME_REGEX)) {
        throw new DdlException("illegal label name [" + label + "]");
    }
    if (graphDef.hasLabel(label)) {
        throw new DdlException("label [" + label + "] already exists, schema version [" + version + "]");
    }
    if (typeDef.getTypeEnum() == TypeEnum.VERTEX) {
        if (this instanceof CreateEdgeTypeExecutor) {
            throw new DdlException("Expect edge type but got vertex type");
        }
        if (typeDef.getPkIdxs().size() == 0) {
            throw new DdlException("Vertex type must define primary key. label [" + label + "]");
        }
    } else if (this instanceof CreateVertexTypeExecutor) {
        throw new DdlException("Expect vertex type but got edge type");
    }
    GraphDef.Builder graphDefBuilder = GraphDef.newBuilder(graphDef);
    TypeDef.Builder typeDefBuilder = TypeDef.newBuilder(typeDef);
    int propertyIdx = graphDef.getPropertyIdx();
    Map<String, Integer> propertyNameToId = graphDef.getPropertyNameToId();
    List<PropertyDef> inputPropertiesInfo = typeDef.getProperties();
    List<PropertyDef> propertyDefs = new ArrayList<>(inputPropertiesInfo.size());
    for (PropertyDef property : inputPropertiesInfo) {
        String propertyName = property.getName();
        if (!propertyName.matches(NAME_REGEX)) {
            throw new DdlException("illegal property name [" + propertyName + "]");
        }
        Integer propertyId = propertyNameToId.get(propertyName);
        if (propertyId == null) {
            propertyIdx++;
            propertyId = propertyIdx;
            graphDefBuilder.putPropertyNameToId(propertyName, propertyId);
            graphDefBuilder.setPropertyIdx(propertyIdx);
        }
        propertyDefs.add(PropertyDef.newBuilder(property).setId(propertyId).setInnerId(propertyId).build());
    }
    typeDefBuilder.setPropertyDefs(propertyDefs);
    int labelIdx = graphDef.getLabelIdx() + 1;
    LabelId labelId = new LabelId(labelIdx);
    typeDefBuilder.setLabelId(labelId);
    TypeDef newTypeDef = typeDefBuilder.build();
    version++;
    graphDefBuilder.setVersion(version);
    graphDefBuilder.addTypeDef(newTypeDef);
    graphDefBuilder.setLabelIdx(labelIdx);
    if (typeDef.getTypeEnum() == TypeEnum.VERTEX) {
        long tableIdx = graphDef.getTableIdx();
        tableIdx++;
        graphDefBuilder.putVertexTableId(labelId, tableIdx);
        graphDefBuilder.setTableIdx(tableIdx);
    }
    GraphDef newGraphDef = graphDefBuilder.build();
    List<Operation> operations = new ArrayList<>(partitionCount);
    for (int i = 0; i < partitionCount; i++) {
        Operation operation = makeOperation(i, version, newTypeDef, newGraphDef);
        operations.add(operation);
    }
    return new DdlResult(newGraphDef, operations);
}
Also used : DdlException(com.alibaba.graphscope.groot.schema.request.DdlException) PropertyDef(com.alibaba.maxgraph.sdkcommon.schema.PropertyDef) ArrayList(java.util.ArrayList) ByteString(com.google.protobuf.ByteString) Operation(com.alibaba.graphscope.groot.operation.Operation) GraphDef(com.alibaba.maxgraph.sdkcommon.schema.GraphDef) TypeDef(com.alibaba.maxgraph.sdkcommon.schema.TypeDef) LabelId(com.alibaba.maxgraph.sdkcommon.schema.LabelId) TypeDefPb(com.alibaba.maxgraph.proto.groot.TypeDefPb)

Example 2 with PropertyDef

use of com.alibaba.maxgraph.sdkcommon.schema.PropertyDef in project GraphScope by alibaba.

the class AbstractDropTypeExecutor method execute.

@Override
public DdlResult execute(ByteString ddlBlob, GraphDef graphDef, int partitionCount) throws InvalidProtocolBufferException {
    TypeDefPb typeDefPb = TypeDefPb.parseFrom(ddlBlob);
    TypeDef typeDef = TypeDef.parseProto(typeDefPb);
    long version = graphDef.getSchemaVersion();
    String label = typeDef.getLabel();
    if (!graphDef.hasLabel(label)) {
        throw new DdlException("label [" + label + "] not exists, schema version [" + version + "]");
    }
    LabelId labelId = graphDef.getLabelId(label);
    Set<EdgeKind> edgeKindSet = graphDef.getIdToKinds().get(labelId);
    if (edgeKindSet != null && edgeKindSet.size() > 0) {
        throw new DdlException("cannot drop label [" + label + "], since it has related edgeKinds");
    }
    GraphDef.Builder graphDefBuilder = GraphDef.newBuilder(graphDef);
    version++;
    graphDefBuilder.setVersion(version);
    graphDefBuilder.removeTypeDef(label);
    Set<String> remainPropertyNames = new HashSet<>();
    for (TypeDef remainTypeDef : graphDefBuilder.getAllTypeDefs()) {
        for (PropertyDef property : remainTypeDef.getProperties()) {
            remainPropertyNames.add(property.getName());
        }
    }
    graphDefBuilder.clearUnusedPropertyName(remainPropertyNames);
    GraphDef newGraphDef = graphDefBuilder.build();
    List<Operation> operations = new ArrayList<>(partitionCount);
    for (int i = 0; i < partitionCount; i++) {
        operations.add(makeOperation(i, version, labelId));
    }
    return new DdlResult(newGraphDef, operations);
}
Also used : DdlException(com.alibaba.graphscope.groot.schema.request.DdlException) PropertyDef(com.alibaba.maxgraph.sdkcommon.schema.PropertyDef) EdgeKind(com.alibaba.maxgraph.sdkcommon.schema.EdgeKind) ArrayList(java.util.ArrayList) ByteString(com.google.protobuf.ByteString) Operation(com.alibaba.graphscope.groot.operation.Operation) GraphDef(com.alibaba.maxgraph.sdkcommon.schema.GraphDef) TypeDef(com.alibaba.maxgraph.sdkcommon.schema.TypeDef) LabelId(com.alibaba.maxgraph.sdkcommon.schema.LabelId) TypeDefPb(com.alibaba.maxgraph.proto.groot.TypeDefPb) HashSet(java.util.HashSet)

Example 3 with PropertyDef

use of com.alibaba.maxgraph.sdkcommon.schema.PropertyDef in project GraphScope by alibaba.

the class SchemaManagerTest method testSchemaManager.

@Test
void testSchemaManager() throws IOException, InterruptedException {
    SnapshotManager mockSnapshotManager = mock(SnapshotManager.class);
    doAnswer(invocationOnMock -> {
        SnapshotListener listener = invocationOnMock.getArgument(1);
        listener.onSnapshotAvailable();
        return null;
    }).when(mockSnapshotManager).addSnapshotListener(anyLong(), any());
    when(mockSnapshotManager.increaseWriteSnapshotId()).thenReturn(1L);
    when(mockSnapshotManager.getCurrentWriteSnapshotId()).thenReturn(1L);
    DdlExecutors ddlExecutors = new DdlExecutors();
    DdlWriter mockDdlWriter = mock(DdlWriter.class);
    when(mockDdlWriter.writeOperations(anyString(), any())).thenReturn(new BatchId(1L));
    MetaService mockMetaService = mock(MetaService.class);
    GraphDefFetcher mockGraphDefFetcher = mock(GraphDefFetcher.class);
    GraphDef initialGraphDef = GraphDef.newBuilder().build();
    when(mockGraphDefFetcher.fetchGraphDef()).thenReturn(initialGraphDef);
    SchemaManager schemaManager = new SchemaManager(mockSnapshotManager, ddlExecutors, mockDdlWriter, mockMetaService, mockGraphDefFetcher);
    schemaManager.start();
    assertEquals(initialGraphDef, schemaManager.getGraphDef());
    PropertyValue defaultValue = new PropertyValue(DataType.INT, ByteBuffer.allocate(Integer.BYTES).putInt(1).array());
    PropertyDef propertyDef = new PropertyDef(1, 1, "p1", DataType.INT, defaultValue, true, "property_1");
    TypeDef typeDef = TypeDef.newBuilder().setLabel("vertex1").addPropertyDef(propertyDef).setTypeEnum(TypeEnum.VERTEX).build();
    DdlRequestBatch ddlRequestBatch = DdlRequestBatch.newBuilder().addDdlRequest(new CreateVertexTypeRequest(typeDef)).build();
    CountDownLatch latch = new CountDownLatch(1);
    schemaManager.submitBatchDdl("requestId", "sessionId", ddlRequestBatch, new CompletionCallback<Long>() {

        @Override
        public void onCompleted(Long res) {
            latch.countDown();
        }

        @Override
        public void onError(Throwable t) {
        }
    });
    assertTrue(latch.await(5L, TimeUnit.SECONDS));
    schemaManager.stop();
}
Also used : MetaService(com.alibaba.graphscope.groot.meta.MetaService) PropertyDef(com.alibaba.maxgraph.sdkcommon.schema.PropertyDef) BatchId(com.alibaba.graphscope.groot.operation.BatchId) PropertyValue(com.alibaba.maxgraph.sdkcommon.schema.PropertyValue) SchemaManager(com.alibaba.graphscope.groot.coordinator.SchemaManager) CountDownLatch(java.util.concurrent.CountDownLatch) GraphDefFetcher(com.alibaba.graphscope.groot.coordinator.GraphDefFetcher) GraphDef(com.alibaba.maxgraph.sdkcommon.schema.GraphDef) SnapshotListener(com.alibaba.graphscope.groot.SnapshotListener) DdlWriter(com.alibaba.graphscope.groot.coordinator.DdlWriter) TypeDef(com.alibaba.maxgraph.sdkcommon.schema.TypeDef) DdlExecutors(com.alibaba.graphscope.groot.schema.ddl.DdlExecutors) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) CreateVertexTypeRequest(com.alibaba.graphscope.groot.schema.request.CreateVertexTypeRequest) DdlRequestBatch(com.alibaba.graphscope.groot.schema.request.DdlRequestBatch) SnapshotManager(com.alibaba.graphscope.groot.coordinator.SnapshotManager) Test(org.junit.jupiter.api.Test)

Example 4 with PropertyDef

use of com.alibaba.maxgraph.sdkcommon.schema.PropertyDef in project GraphScope by alibaba.

the class DdlExecutorTest method testExecutor.

@Test
void testExecutor() throws InvalidProtocolBufferException {
    PropertyValue defaultValue = new PropertyValue(DataType.INT, ByteBuffer.allocate(Integer.BYTES).putInt(1).array());
    PropertyDef propertyDef = new PropertyDef(1, 1, "p1", DataType.INT, defaultValue, true, "property_1");
    TypeDef vertexTypeDef = TypeDef.newBuilder().setLabel("vertex1").addPropertyDef(propertyDef).setTypeEnum(TypeEnum.VERTEX).build();
    TypeDef edgeTypeDef = TypeDef.newBuilder().setLabel("edge1").addPropertyDef(propertyDef).setTypeEnum(TypeEnum.EDGE).build();
    EdgeKind edgeKind = EdgeKind.newBuilder().setEdgeLabel("edge1").setDstVertexLabel("vertex1").setSrcVertexLabel("vertex1").build();
    GraphDef graphDef = GraphDef.newBuilder().build();
    DdlExecutors ddlExecutors = new DdlExecutors();
    DdlRequestBatch.Builder requestBatchBuilder = DdlRequestBatch.newBuilder();
    requestBatchBuilder.addDdlRequest(new CreateVertexTypeRequest(vertexTypeDef));
    requestBatchBuilder.addDdlRequest(new CreateEdgeTypeRequest(edgeTypeDef));
    requestBatchBuilder.addDdlRequest(new AddEdgeKindRequest(edgeKind));
    DdlRequestBatch ddlRequestBatch = requestBatchBuilder.build();
    // Test serde
    ByteString bytes = ddlRequestBatch.toProto().toByteString();
    assertEquals(DdlRequestBatch.parseProto(DdlRequestBatchPb.parseFrom(bytes)), ddlRequestBatch);
    DdlResult ddlResult = ddlExecutors.executeDdlRequestBatch(ddlRequestBatch, graphDef, 1);
    LabelId vertexLabelId = new LabelId(1);
    LabelId edgeLabelId = new LabelId(2);
    EdgeKind edgeKindWithId = EdgeKind.newBuilder(edgeKind).setEdgeLabelId(edgeLabelId).setSrcVertexLabelId(vertexLabelId).setDstVertexLabelId(vertexLabelId).build();
    TypeDef vertexTypeWithId = TypeDef.newBuilder(vertexTypeDef).setLabelId(vertexLabelId).build();
    TypeDef edgeTypeWithId = TypeDef.newBuilder(edgeTypeDef).setLabelId(edgeLabelId).build();
    graphDef = GraphDef.newBuilder(graphDef).setVersion(3).setLabelIdx(2).setPropertyIdx(1).putPropertyNameToId("p1", 1).addTypeDef(vertexTypeWithId).putVertexTableId(vertexTypeWithId.getTypeLabelId(), 1L).addTypeDef(edgeTypeWithId).addEdgeKind(edgeKindWithId).putEdgeTableId(edgeKindWithId, 2L).setTableIdx(2L).build();
    assertEquals(graphDef, ddlResult.getGraphDef());
    List<Operation> ddlOperations = ddlResult.getDdlOperations();
    assertEquals(ddlOperations.size(), 3);
    assertEquals(ddlOperations.get(0).toBlob().toProto(), new CreateVertexTypeOperation(0, 1L, vertexTypeWithId, 1L).toBlob().toProto());
    assertEquals(ddlOperations.get(1).toBlob().toProto(), new CreateEdgeTypeOperation(0, 2L, edgeTypeWithId).toBlob().toProto());
    assertEquals(ddlOperations.get(2).toBlob().toProto(), new AddEdgeKindOperation(0, 3L, edgeKindWithId, 2L).toBlob().toProto());
    assertEquals(GraphDef.parseProto(GraphDefPb.parseFrom(graphDef.toProto().toByteString())), graphDef);
    requestBatchBuilder = DdlRequestBatch.newBuilder();
    requestBatchBuilder.addDdlRequest(new RemoveEdgeKindRequest(edgeKind));
    requestBatchBuilder.addDdlRequest(new DropEdgeTypeRequest(edgeTypeDef.getLabel()));
    requestBatchBuilder.addDdlRequest(new DropVertexTypeRequest(vertexTypeDef.getLabel()));
    ddlResult = ddlExecutors.executeDdlRequestBatch(requestBatchBuilder.build(), graphDef, 1);
    graphDef = GraphDef.newBuilder(graphDef).setVersion(6).removeEdgeKind(edgeKindWithId).removeTypeDef(edgeTypeDef.getLabel()).removeTypeDef(vertexTypeDef.getLabel()).clearUnusedPropertyName(Collections.emptySet()).build();
    assertEquals(graphDef, ddlResult.getGraphDef());
    ddlOperations = ddlResult.getDdlOperations();
    assertEquals(ddlOperations.size(), 3);
    assertEquals(ddlOperations.get(0).toBlob().toProto(), new RemoveEdgeKindOperation(0, 4L, edgeKindWithId).toBlob().toProto());
    assertEquals(ddlOperations.get(1).toBlob().toProto(), new DropEdgeTypeOperation(0, 5L, edgeLabelId).toBlob().toProto());
    assertEquals(ddlOperations.get(2).toBlob().toProto(), new DropVertexTypeOperation(0, 6L, vertexLabelId).toBlob().toProto());
}
Also used : PropertyDef(com.alibaba.maxgraph.sdkcommon.schema.PropertyDef) ByteString(com.google.protobuf.ByteString) EdgeKind(com.alibaba.maxgraph.sdkcommon.schema.EdgeKind) CreateVertexTypeOperation(com.alibaba.graphscope.groot.operation.ddl.CreateVertexTypeOperation) CreateEdgeTypeOperation(com.alibaba.graphscope.groot.operation.ddl.CreateEdgeTypeOperation) DropVertexTypeOperation(com.alibaba.graphscope.groot.operation.ddl.DropVertexTypeOperation) Operation(com.alibaba.graphscope.groot.operation.Operation) DropEdgeTypeOperation(com.alibaba.graphscope.groot.operation.ddl.DropEdgeTypeOperation) RemoveEdgeKindOperation(com.alibaba.graphscope.groot.operation.ddl.RemoveEdgeKindOperation) AddEdgeKindOperation(com.alibaba.graphscope.groot.operation.ddl.AddEdgeKindOperation) RemoveEdgeKindRequest(com.alibaba.graphscope.groot.schema.request.RemoveEdgeKindRequest) DropVertexTypeOperation(com.alibaba.graphscope.groot.operation.ddl.DropVertexTypeOperation) TypeDef(com.alibaba.maxgraph.sdkcommon.schema.TypeDef) CreateVertexTypeOperation(com.alibaba.graphscope.groot.operation.ddl.CreateVertexTypeOperation) AddEdgeKindOperation(com.alibaba.graphscope.groot.operation.ddl.AddEdgeKindOperation) DropVertexTypeRequest(com.alibaba.graphscope.groot.schema.request.DropVertexTypeRequest) DdlRequestBatch(com.alibaba.graphscope.groot.schema.request.DdlRequestBatch) CreateEdgeTypeOperation(com.alibaba.graphscope.groot.operation.ddl.CreateEdgeTypeOperation) RemoveEdgeKindOperation(com.alibaba.graphscope.groot.operation.ddl.RemoveEdgeKindOperation) AddEdgeKindRequest(com.alibaba.graphscope.groot.schema.request.AddEdgeKindRequest) PropertyValue(com.alibaba.maxgraph.sdkcommon.schema.PropertyValue) GraphDef(com.alibaba.maxgraph.sdkcommon.schema.GraphDef) DdlExecutors(com.alibaba.graphscope.groot.schema.ddl.DdlExecutors) DropEdgeTypeOperation(com.alibaba.graphscope.groot.operation.ddl.DropEdgeTypeOperation) CreateVertexTypeRequest(com.alibaba.graphscope.groot.schema.request.CreateVertexTypeRequest) LabelId(com.alibaba.maxgraph.sdkcommon.schema.LabelId) DropEdgeTypeRequest(com.alibaba.graphscope.groot.schema.request.DropEdgeTypeRequest) CreateEdgeTypeRequest(com.alibaba.graphscope.groot.schema.request.CreateEdgeTypeRequest) DdlResult(com.alibaba.graphscope.groot.schema.ddl.DdlResult) Test(org.junit.jupiter.api.Test)

Example 5 with PropertyDef

use of com.alibaba.maxgraph.sdkcommon.schema.PropertyDef in project GraphScope by alibaba.

the class ClientDdlService method toTypeDefPb.

private TypeDefPb toTypeDefPb(TypeDef typeDef) {
    TypeDefPb.Builder builder = TypeDefPb.newBuilder();
    builder.setVersionId(typeDef.getVersionId());
    builder.setLabel(typeDef.getLabel());
    builder.setLabelId(LabelIdPb.newBuilder().setId(typeDef.getLabelId()).build());
    switch(typeDef.getTypeEnum()) {
        case VERTEX:
            builder.setTypeEnum(TypeEnumPb.VERTEX);
            break;
        case EDGE:
            builder.setTypeEnum(TypeEnumPb.EDGE);
            break;
        default:
            throw new IllegalArgumentException("Invalid type enum [" + typeDef.getTypeEnum() + "]");
    }
    for (PropertyDef property : typeDef.getProperties()) {
        builder.addProps(toPropertyDefPb(property));
    }
    return builder.build();
}
Also used : PropertyDef(com.alibaba.maxgraph.sdkcommon.schema.PropertyDef)

Aggregations

PropertyDef (com.alibaba.maxgraph.sdkcommon.schema.PropertyDef)5 GraphDef (com.alibaba.maxgraph.sdkcommon.schema.GraphDef)4 TypeDef (com.alibaba.maxgraph.sdkcommon.schema.TypeDef)4 Operation (com.alibaba.graphscope.groot.operation.Operation)3 LabelId (com.alibaba.maxgraph.sdkcommon.schema.LabelId)3 ByteString (com.google.protobuf.ByteString)3 DdlExecutors (com.alibaba.graphscope.groot.schema.ddl.DdlExecutors)2 CreateVertexTypeRequest (com.alibaba.graphscope.groot.schema.request.CreateVertexTypeRequest)2 DdlException (com.alibaba.graphscope.groot.schema.request.DdlException)2 DdlRequestBatch (com.alibaba.graphscope.groot.schema.request.DdlRequestBatch)2 TypeDefPb (com.alibaba.maxgraph.proto.groot.TypeDefPb)2 EdgeKind (com.alibaba.maxgraph.sdkcommon.schema.EdgeKind)2 PropertyValue (com.alibaba.maxgraph.sdkcommon.schema.PropertyValue)2 ArrayList (java.util.ArrayList)2 Test (org.junit.jupiter.api.Test)2 SnapshotListener (com.alibaba.graphscope.groot.SnapshotListener)1 DdlWriter (com.alibaba.graphscope.groot.coordinator.DdlWriter)1 GraphDefFetcher (com.alibaba.graphscope.groot.coordinator.GraphDefFetcher)1 SchemaManager (com.alibaba.graphscope.groot.coordinator.SchemaManager)1 SnapshotManager (com.alibaba.graphscope.groot.coordinator.SnapshotManager)1