public void testQueryVertexByAggregateProperty()

in hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/VertexCoreTest.java [6902:7162]


    public void testQueryVertexByAggregateProperty() {
        Assume.assumeTrue("Not support aggregate property",
                          storeFeatures().supportsAggregateProperty());

        HugeGraph graph = graph();
        SchemaManager schema = graph.schema();

        schema.propertyKey("worstScore")
              .asInt().valueSingle().calcMin()
              .ifNotExist().create();
        schema.propertyKey("bestScore")
              .asInt().valueSingle().calcMax()
              .ifNotExist().create();
        schema.propertyKey("testNum")
              .asInt().valueSingle().calcSum()
              .ifNotExist().create();
        schema.propertyKey("no")
              .asText().valueSingle().calcOld()
              .ifNotExist().create();
        schema.propertyKey("rank")
              .asInt().valueSet().calcSet()
              .ifNotExist().create();
        schema.propertyKey("reword")
              .asInt().valueList().calcList()
              .ifNotExist().create();

        schema.vertexLabel("student")
              .properties("name", "worstScore", "bestScore",
                          "testNum", "no", "rank", "reword")
              .primaryKeys("name")
              .nullableKeys("worstScore", "bestScore",
                            "testNum", "no", "rank", "reword")
              .ifNotExist()
              .create();

        schema.indexLabel("studentByWorstScore")
              .onV("student").by("worstScore").range().ifNotExist().create();
        schema.indexLabel("studentByBestScore")
              .onV("student").by("bestScore").range().ifNotExist().create();
        Assert.assertThrows(IllegalArgumentException.class, () -> {
            schema.indexLabel("studentByTestNum")
                  .onV("student").by("testNum").range().ifNotExist().create();
        }, e -> {
            Assert.assertContains("The aggregate type SUM is not indexable",
                                  e.getMessage());
        });
        schema.indexLabel("studentByNo")
              .onV("student").by("no").secondary().ifNotExist().create();
        Assert.assertThrows(IllegalArgumentException.class, () -> {
            schema.indexLabel("studentByRank")
                  .onV("student").by("rank").secondary().ifNotExist().create();
        }, e -> {
            Assert.assertTrue(e.getMessage(), e.getMessage().contains(
                    "The aggregate type SET is not indexable"));
        });
        Assert.assertThrows(IllegalArgumentException.class, () -> {
            schema.indexLabel("studentByReword")
                  .onV("student").by("reword").secondary().ifNotExist()
                  .create();
        }, e -> {
            Assert.assertTrue(e.getMessage(), e.getMessage().contains(
                    "The aggregate type LIST is not indexable"));
        });

        graph.addVertex(T.label, "student", "name", "Tom", "worstScore", 55,
                        "bestScore", 96, "testNum", 1, "no", "001");
        this.commitTx();

        List<Vertex> vertices = graph.traversal().V().hasLabel("student")
                                     .has("name", "Tom").toList();
        Assert.assertEquals(1, vertices.size());
        Vertex tom = vertices.get(0);
        Assert.assertEquals(55, tom.value("worstScore"));
        Assert.assertEquals(96, tom.value("bestScore"));
        Assert.assertEquals(1, tom.value("testNum"));
        Assert.assertEquals("001", tom.value("no"));

        List<Vertex> results = graph.traversal().V()
                                    .has("worstScore", P.gt(50)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", P.lt(60)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", 55).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.gt(50)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.lt(100)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", 96).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("no", "001").toList();
        Assert.assertEquals(vertices, results);

        tom.property("worstScore", 45);
        tom.property("bestScore", 98);
        tom.property("testNum", 1);
        tom.property("no", "002");
        this.commitTx();

        vertices = graph.traversal().V().hasLabel("student")
                        .has("name", "Tom").toList();
        Assert.assertEquals(1, vertices.size());
        tom = vertices.get(0);
        Assert.assertEquals(45, tom.value("worstScore"));
        Assert.assertEquals(98, tom.value("bestScore"));
        Assert.assertEquals(2, tom.value("testNum"));
        Assert.assertEquals("001", tom.value("no"));

        results = graph.traversal().V().has("worstScore", P.gt(30)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", P.lt(60)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", 45).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.gt(50)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.lt(100)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", 98).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("no", "001").toList();
        Assert.assertEquals(vertices, results);

        tom = graph.traversal().V().hasLabel("student")
                   .has("name", "Tom").next();
        tom.property("worstScore", 65);
        tom.property("bestScore", 99);
        tom.property("testNum", 1);
        tom.property("no", "003");
        this.commitTx();

        vertices = graph.traversal().V().hasLabel("student")
                        .has("name", "Tom").toList();
        Assert.assertEquals(1, vertices.size());
        tom = vertices.get(0);
        Assert.assertEquals(45, tom.value("worstScore"));
        Assert.assertEquals(99, tom.value("bestScore"));
        Assert.assertEquals(3, tom.value("testNum"));
        Assert.assertEquals("001", tom.value("no"));

        results = graph.traversal().V().has("worstScore", P.gt(30)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", P.lt(60)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", 45).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.gt(50)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.lt(100)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", 99).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("no", "001").toList();
        Assert.assertEquals(vertices, results);

        tom = graph.traversal().V().hasLabel("student")
                   .has("name", "Tom").next();
        tom.property("worstScore", 75);
        tom.property("bestScore", 100);
        tom.property("testNum", 1);
        tom.property("no", "004");
        this.commitTx();

        vertices = graph.traversal().V().hasLabel("student")
                        .has("name", "Tom").toList();
        Assert.assertEquals(1, vertices.size());
        tom = vertices.get(0);
        Assert.assertEquals(45, tom.value("worstScore"));
        Assert.assertEquals(100, tom.value("bestScore"));
        Assert.assertEquals(4, tom.value("testNum"));
        Assert.assertEquals("001", tom.value("no"));

        results = graph.traversal().V().has("worstScore", P.gt(30)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", P.lt(60)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", 45).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.gt(50)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.lt(101)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", 100).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("no", "001").toList();
        Assert.assertEquals(vertices, results);

        tom = graph.traversal().V().hasLabel("student")
                   .has("name", "Tom").next();
        tom.property("worstScore", 35);
        tom.property("bestScore", 99);
        tom.property("testNum", 1);
        tom.property("no", "005");
        this.commitTx();

        tom.property("worstScore", 65);
        tom.property("bestScore", 93);
        tom.property("testNum", 1);
        tom.property("no", "006");
        this.commitTx();

        tom.property("worstScore", 58);
        tom.property("bestScore", 63);
        tom.property("testNum", 1);
        tom.property("no", "007");
        this.commitTx();

        vertices = graph.traversal().V().hasLabel("student")
                        .has("name", "Tom").toList();
        Assert.assertEquals(1, vertices.size());
        tom = vertices.get(0);
        Assert.assertEquals(35, tom.value("worstScore"));
        Assert.assertEquals(100, tom.value("bestScore"));
        Assert.assertEquals(7, tom.value("testNum"));
        Assert.assertEquals("001", tom.value("no"));

        results = graph.traversal().V().has("worstScore", P.gt(30)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", P.lt(60)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("worstScore", 35).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.gt(50)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", P.lt(101)).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("bestScore", 100).toList();
        Assert.assertEquals(vertices, results);

        results = graph.traversal().V().has("no", "001").toList();
        Assert.assertEquals(vertices, results);
    }