Search in sources :

Example 6 with SimpleDataElement

use of com.linkedin.data.element.SimpleDataElement in project rest.li by linkedin.

the class RestLiDataValidator method checkNewRecordsAreNotMissingFields.

private ValidationResult checkNewRecordsAreNotMissingFields(RecordTemplate entity, MessageList<Message> messages) {
    for (Message message : messages) {
        Object[] path = message.getPath();
        if (path[path.length - 1].toString().equals(PatchConstants.SET_COMMAND)) {
            // Replace $set with the field name to get the full path
            path[path.length - 1] = message.getFormat();
            DataElement element = DataElementUtil.element(new SimpleDataElement(entity.data(), entity.schema()), path);
            ValidationResult result = ValidateDataAgainstSchema.validate(element, new ValidationOptions());
            if (!result.isValid()) {
                return result;
            }
        }
    }
    return null;
}
Also used : SimpleDataElement(com.linkedin.data.element.SimpleDataElement) DataElement(com.linkedin.data.element.DataElement) Message(com.linkedin.data.message.Message) SimpleDataElement(com.linkedin.data.element.SimpleDataElement) ValidationResult(com.linkedin.data.schema.validation.ValidationResult) ValidationOptions(com.linkedin.data.schema.validation.ValidationOptions)

Example 7 with SimpleDataElement

use of com.linkedin.data.element.SimpleDataElement in project rest.li by linkedin.

the class TestDataIterator method testNoSchemaWithParentDataElement.

@Test
public void testNoSchemaWithParentDataElement() {
    DataMap root = new DataMap();
    root.put("bytes", ByteString.copyAvroString("abc", false));
    root.put("int", 1);
    root.put("string", "foo");
    root.put("boolean", false);
    root.put("double", 4.0);
    root.put("long", 2L);
    root.put("float", 3.0f);
    DataMap grandParent = new DataMap();
    DataMap parent = new DataMap();
    grandParent.put("child", parent);
    parent.put("child", root);
    DataElement grandParentElement = new SimpleDataElement(grandParent, null);
    DataElement parentElement = new SimpleDataElement(parent, "child", null, grandParentElement);
    DataElement element = new SimpleDataElement(root, "child", null, parentElement);
    /*
    //Possible preExpected output:
    String preExpected =
      "  path=/child/child, class=com.linkedin.data.DataMap\n" +
      "   path=/child/child/bytes, class=com.linkedin.data.ByteString, value=abc\n" +
      "   path=/child/child/int, class=java.lang.Integer, value=1\n" +
      "   path=/child/child/string, class=java.lang.String, value=foo\n" +
      "   path=/child/child/boolean, class=java.lang.Boolean, value=false\n" +
      "   path=/child/child/double, class=java.lang.Double, value=4.0\n" +
      "   path=/child/child/long, class=java.lang.Long, value=2\n" +
      "   path=/child/child/float, class=java.lang.Float, value=3.0\n";

    //Possible postExpected output:
    String postExpected =
      "   path=/child/child/bytes, class=com.linkedin.data.ByteString, value=abc\n" +
      "   path=/child/child/int, class=java.lang.Integer, value=1\n" +
      "   path=/child/child/string, class=java.lang.String, value=foo\n" +
      "   path=/child/child/boolean, class=java.lang.Boolean, value=false\n" +
      "   path=/child/child/double, class=java.lang.Double, value=4.0\n" +
      "   path=/child/child/long, class=java.lang.Long, value=2\n" +
      "   path=/child/child/float, class=java.lang.Float, value=3.0\n" +
      "  path=/child/child, class=com.linkedin.data.DataMap\n";
      */
    final Set<String> commonValues = new HashSet<String>();
    commonValues.add("path=/child/child/bytes, class=com.linkedin.data.ByteString, value=abc");
    commonValues.add("path=/child/child/int, class=java.lang.Integer, value=1");
    commonValues.add("path=/child/child/string, class=java.lang.String, value=foo");
    commonValues.add("path=/child/child/boolean, class=java.lang.Boolean, value=false");
    commonValues.add("path=/child/child/double, class=java.lang.Double, value=4.0");
    commonValues.add("path=/child/child/long, class=java.lang.Long, value=2");
    commonValues.add("path=/child/child/float, class=java.lang.Float, value=3.0");
    List<String> preOrderTraversal = traverseWithDataElement(element, IterationOrder.PRE_ORDER, true);
    Set<String> preOrderTraversalWithoutRoot = new HashSet<String>(preOrderTraversal.subList(1, preOrderTraversal.size()));
    Assert.assertEquals(preOrderTraversal.get(0), "path=/child/child, class=com.linkedin.data.DataMap", "The first node in the pre order traversal should be: com.linkedin.data.DataMap");
    List<String> postOrderTraversal = traverseWithDataElement(element, IterationOrder.POST_ORDER, true);
    Set<String> postOrderTraversalWithoutRoot = new HashSet<String>(postOrderTraversal.subList(0, postOrderTraversal.size() - 1));
    Assert.assertEquals(postOrderTraversal.get(postOrderTraversal.size() - 1), "path=/child/child, class=com.linkedin.data.DataMap", "The last node in the post order traversal should be: com.linkedin.data.DataMap");
    Assert.assertEquals(preOrderTraversalWithoutRoot, postOrderTraversalWithoutRoot, "The traversals without the root should match each other");
    Assert.assertEquals(preOrderTraversalWithoutRoot, commonValues, "The traversals should cover all the leaves");
}
Also used : SimpleDataElement(com.linkedin.data.element.SimpleDataElement) DataElement(com.linkedin.data.element.DataElement) SimpleDataElement(com.linkedin.data.element.SimpleDataElement) ByteString(com.linkedin.data.ByteString) DataMap(com.linkedin.data.DataMap) HashSet(java.util.HashSet) Test(org.testng.annotations.Test)

Example 8 with SimpleDataElement

use of com.linkedin.data.element.SimpleDataElement in project rest.li by linkedin.

the class RestLiDataValidator method hollowElementFromPath.

/**
   * Create a hollow data element in which only getName() and getParent() work correctly.
   * This method is used to test $delete partial update paths against {@link PathMatchesPatternPredicate}.
   *
   * @param path the path from the root to the element, including the name of the element
   * @return a hollow data element
   */
private static DataElement hollowElementFromPath(Object[] path) {
    DataElement root = new SimpleDataElement(null, null);
    DataElement current = root;
    for (Object component : path) {
        DataElement child = new SimpleDataElement(null, component.toString(), null, current);
        current = child;
    }
    return current;
}
Also used : SimpleDataElement(com.linkedin.data.element.SimpleDataElement) DataElement(com.linkedin.data.element.DataElement) SimpleDataElement(com.linkedin.data.element.SimpleDataElement)

Aggregations

SimpleDataElement (com.linkedin.data.element.SimpleDataElement)8 DataElement (com.linkedin.data.element.DataElement)4 Test (org.testng.annotations.Test)4 SimpleTestData (com.linkedin.data.it.IteratorTestData.SimpleTestData)3 Message (com.linkedin.data.message.Message)3 ValidationResult (com.linkedin.data.schema.validation.ValidationResult)3 DataMap (com.linkedin.data.DataMap)2 ValidationOptions (com.linkedin.data.schema.validation.ValidationOptions)2 ByteString (com.linkedin.data.ByteString)1 DataSchema (com.linkedin.data.schema.DataSchema)1 NamedDataSchema (com.linkedin.data.schema.NamedDataSchema)1 RecordDataSchema (com.linkedin.data.schema.RecordDataSchema)1 RecordTemplate (com.linkedin.data.template.RecordTemplate)1 DataComplexProcessor (com.linkedin.data.transform.DataComplexProcessor)1 DataProcessingException (com.linkedin.data.transform.DataProcessingException)1 Patch (com.linkedin.data.transform.patch.Patch)1 PatchRequest (com.linkedin.restli.common.PatchRequest)1 HashSet (java.util.HashSet)1