GremlinScriptLiteralVertex.java

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.spring.data.gremlin.conversion.script;

import static com.azure.spring.data.gremlin.common.Constants.GREMLIN_PRIMITIVE_DROP;
import static com.azure.spring.data.gremlin.common.Constants.GREMLIN_PRIMITIVE_GRAPH;
import static com.azure.spring.data.gremlin.common.Constants.GREMLIN_PRIMITIVE_VERTEX_ALL;
import static com.azure.spring.data.gremlin.common.Constants.GREMLIN_PROPERTY_CLASSNAME;
import static com.azure.spring.data.gremlin.common.Constants.GREMLIN_SCRIPT_VERTEX_ALL;
import static com.azure.spring.data.gremlin.common.Constants.GREMLIN_SCRIPT_VERTEX_DROP_ALL;
import static com.azure.spring.data.gremlin.common.GremlinEntityType.VERTEX;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.completeScript;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generateAddEntityWithLabel;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generateEntityWithRequiredId;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generateHas;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generateHasId;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generateHasLabel;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generateProperties;
import static com.azure.spring.data.gremlin.conversion.script.GremlinScriptLiteralHelper.generatePropertyWithRequiredId;

import com.azure.spring.data.gremlin.conversion.source.GremlinSource;
import com.azure.spring.data.gremlin.conversion.source.GremlinSourceVertex;
import com.azure.spring.data.gremlin.exception.GremlinUnexpectedSourceTypeException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.util.Assert;

public class GremlinScriptLiteralVertex implements GremlinScriptLiteral {

    @Override
    public <T> List<String> generateInsertScript(@NonNull GremlinSource<T> source) {
        Assert.notNull(source, "source should not be null");
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        final List<String> scriptList = new ArrayList<>();

        scriptList.add(GREMLIN_PRIMITIVE_GRAPH);                                            // g
        scriptList.add(generateAddEntityWithLabel(source.getLabel(), VERTEX));              // addV('label')

        source.getId().ifPresent(id -> scriptList.add(generatePropertyWithRequiredId(id))); // property(id, xxx)

        scriptList.addAll(generateProperties(source.getProperties()));

        return completeScript(scriptList);
    }

    @Override
    public List<String> generateDeleteAllScript() {
        return Collections.singletonList(GREMLIN_SCRIPT_VERTEX_DROP_ALL);
    }

    @Override
    public <T> List<String> generateDeleteAllByClassScript(@NonNull GremlinSource<T> source) {
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        final List<String> scriptList = Arrays.asList(
            GREMLIN_PRIMITIVE_GRAPH,             // g
            GREMLIN_PRIMITIVE_VERTEX_ALL,        // V()
            generateHasLabel(source.getLabel()), // has(label, 'label')
            GREMLIN_PRIMITIVE_DROP               // drop()
        );

        return completeScript(scriptList);
    }

    @Override
    public <T> List<String> generateFindByIdScript(@NonNull GremlinSource<T> source) {
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        Assert.isTrue(source.getId().isPresent(), "GremlinSource should contain id.");

        final List<String> scriptList = Arrays.asList(
            GREMLIN_PRIMITIVE_GRAPH,                                 // g
            GREMLIN_PRIMITIVE_VERTEX_ALL,                            // V()
            generateHasId(source.getId().get(), source.getIdField()) // hasId(xxx)
        );

        return completeScript(scriptList);
    }

    @Override
    public <T> List<String> generateUpdateScript(@NonNull GremlinSource<T> source) {
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        final List<String> scriptList = new ArrayList<>();

        Assert.isTrue(source.getId().isPresent(), "GremlinSource should contain id.");

        scriptList.add(GREMLIN_PRIMITIVE_GRAPH);                                    // g
        scriptList.add(generateEntityWithRequiredId(source.getId().get(), VERTEX)); // V(id)
        scriptList.addAll(generateProperties(source.getProperties()));

        return completeScript(scriptList);
    }

    @Override
    public <T> List<String> generateFindAllScript(@NonNull GremlinSource<T> source) {
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        final String classname = source.getProperties().get(GREMLIN_PROPERTY_CLASSNAME).toString();
        Assert.notNull(classname, "GremlinSource should contain predefined classname");

        final List<String> scriptList = Arrays.asList(
            GREMLIN_PRIMITIVE_GRAPH,                           // g
            GREMLIN_PRIMITIVE_VERTEX_ALL,                      // V()
            generateHasLabel(source.getLabel()),               // has(label, 'label')
            generateHas(GREMLIN_PROPERTY_CLASSNAME, classname) // has(_classname, 'xxxxxx')
        );

        return completeScript(scriptList);
    }

    @Override
    public <T> List<String> generateDeleteByIdScript(@NonNull GremlinSource<T> source) {
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        Assert.isTrue(source.getId().isPresent(), "GremlinSource should contain id.");

        final List<String> scriptList = Arrays.asList(
            GREMLIN_PRIMITIVE_GRAPH,                                  // g
            GREMLIN_PRIMITIVE_VERTEX_ALL,                             // E()
            generateHasId(source.getId().get(), source.getIdField()), // hasId(xxx)
            GREMLIN_PRIMITIVE_DROP                                    // drop()
        );

        return completeScript(scriptList);
    }

    @Override
    public <T> List<String> generateCountScript(@NonNull GremlinSource<T> source) {
        if (!(source instanceof GremlinSourceVertex)) {
            throw new GremlinUnexpectedSourceTypeException("should be the instance of GremlinSourceVertex");
        }

        return Collections.singletonList(GREMLIN_SCRIPT_VERTEX_ALL);
    }
}