Есть ли ложная функция в tinkerpop gremlin?

#java #gremlin #tinkerpop

Вопрос:

У нас есть один сервис обмена фотографиями, в котором можно разрешить или запретить просмотр другим пользователям или нет. Мы представили эту службу как API /представление?вызывающий абонент=идентификатор пользователя и фотоид=Фотоид. Мы используем сервис базы данных AWS Neptune Graph для поддержки этой авторизации и используем библиотеку java tinkerpop.

Для удобства обслуживания кода мы выбираем возможные пути из других методов класса и вызываем метод canUserView извне.

 Public class Authorizer {
    List<Role> roles;
    
    public Authorizer(List<Role> roles) {
        this.roles = roles;
    }
    
    public boolean canUserView(User user, String photoId) {
        return graph.V(user.getId()).hasLabel("user").or(getPossibleTraversals(user)).hasId("photoId")
    }

    private GraphTraversal<Object, Vertex>[] getPossibleTraversals(User user) {
        List<GraphTraversal<Vertex, Vertex>> traversals = roles.getTraversal(user).map(traversal -> traversal).collect(Collectors.toList())
        return traversals.toArray(GraphTraversal[]::new);
    }
}
 

и в классе ролей getTraversal для производительности кода на основе информации о пользователе я предоставляю необходимый обход или могу предоставить обход сбоя.

Теперь вопрос в том, как обеспечить обход отказа здесь. На данный момент мы предполагаем, что какой-то недоступный идентификатор вершины для обхода сбоя. Код выглядит так, как показано ниже.

 public class Role {

    public GraphTraversal<Object, Vertex> getTraversal(User user) {
        if(user.satisfies(this)) {
            return __.V("assumedUnavailableVertexId").hasLabel("absolutelynotpossible"); //This ID and label assumed
        } else {
            return actualTraversal();   //This will construct the possible traversals
        }
    }
}
 

Как вернуть обход сбоя для случая if в роли? Есть ли какой-нибудь способ устранить это предположение ?

Комментарии:

1. Я не уверен, что полностью понимаю ваш вопрос. Вы просите простой способ вернуть обход, который указывает на то, что что-то не удалось? Я часто видел что — то столь же простое, как constant('Not allowed') используемое в таких случаях.

2. Да, мне нужен обход, потому что что-то не получилось.

3. Проблема с .constant(«Не разрешено») заключается в том, что возвращаемый тип .constant () — это GraphTraversal<Строка, строка> . В успешных случаях это будет GraphTraversal<Объект, вершина>. Если я задам тип возвращаемого значения без параметра type, т. е. public GraphTraversal getTraversal(), то наш sonarqube жалуется, что параметр универсального типа является обязательным.

4. Сможешь ли ты смириться с Traversal <Object,Object> этим делом? В Гремлине нет ничего необычного в том, что обход может иметь разные результаты в зависимости от того, какие ветви он принимает.

5. Я думаю, это будет прекрасно. .константа(«Не разрешено») будет работать здесь. Иногда бывает трудно соблюдать правила Sonarqube. rules.sonarsource.com/java/RSPEC-1452 . Спасибо @KelvinLawrence

Ответ №1:

Я часто видел что-то столь же простое, как constant('Not allowed') используемое, когда обход должен возвращать указание на то, что произошла ошибка/проблема.

В этом случае (если вам нужна чистая общая проверка компилятора и т. Д.) Вам Нужно будет начать с чего-то вроде Traversal <Object,Object> того, что разные пути в вашем коде потенциально могут теперь возвращать разные типы обхода.