static MetadataFactory oneToOneRelationMetadata() throws TranslatorException {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "northwind",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    CsdlEntityType g1Entity = entityType("g1");
    CsdlEntityType g2Entity = entityType("g2");

    CsdlNavigationProperty navProperty = new CsdlNavigationProperty();
    navProperty.setName("one_2_one");
    navProperty.setType("namespace.g2");
    navProperty.setNullable(false);
    navProperty.setPartner("PartnerPath");

    g1Entity.setNavigationProperties(Arrays.asList(navProperty));

    CsdlEntitySet g1Set = createES("G1", "namespace.g1");
    CsdlEntitySet g2Set = createES("G2", "namespace.g2");

    CsdlNavigationPropertyBinding navBinding = new CsdlNavigationPropertyBinding();
    navBinding.setPath("one_2_one");
    navBinding.setTarget("G2");
    g1Set.setNavigationPropertyBindings(Arrays.asList(navBinding));

    XMLMetadata metadata = buildXmlMetadata(g1Entity, g1Set, g2Entity, g2Set);
    processor.getMetadata(mf, metadata);
    return mf;
  }
  static MetadataFactory tripPinMetadata() throws TranslatorException {
    ODataMetadataProcessor processor =
        new ODataMetadataProcessor() {
          protected XMLMetadata getSchema(WSConnection conn) throws TranslatorException {
            try {
              ClientODataDeserializerImpl deserializer =
                  new ClientODataDeserializerImpl(false, ContentType.APPLICATION_XML);
              XMLMetadata metadata =
                  deserializer.toMetadata(
                      new FileInputStream(UnitTestUtil.getTestDataFile("trippin.xml")));
              return metadata;
            } catch (FileNotFoundException e) {
              e.printStackTrace();
            }
            return null;
          }
        };
    Properties props = new Properties();
    props.setProperty("schemaNamespace", "Microsoft.OData.SampleService.Models.TripPin");
    MetadataFactory mf =
        new MetadataFactory(
            "vdb", 1, "trippin", SystemMetadata.getInstance().getRuntimeTypeMap(), props, null);
    processor.process(mf, null);
    //        String ddl = DDLStringVisitor.getDDLString(mf.getSchema(), null, null);
    //        System.out.println(ddl);

    return mf;
  }
  @Test
  public void testEnititySet() throws Exception {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "trippin",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    ArrayList<CsdlProperty> properties = new ArrayList<CsdlProperty>();
    properties.add(
        createProperty("name", EdmPrimitiveTypeKind.String).setMaxLength(25).setNullable(false));
    properties.add(createProperty("dob", EdmPrimitiveTypeKind.DateTimeOffset).setNullable(true));
    properties.add(createProperty("ssn", EdmPrimitiveTypeKind.Int64).setNullable(false));

    CsdlEntityType entityType = new CsdlEntityType();
    entityType.setName("Person");
    entityType.setProperties(properties);
    entityType.setKey(Arrays.asList(new CsdlPropertyRef().setName("ssn")));

    CsdlEntitySet es = createES("Persons", "namespace.Person");

    XMLMetadata metadata = buildXmlMetadata(es, entityType);

    processor.getMetadata(mf, metadata);

    assertNotNull(mf.getSchema().getTable("Persons"));

    Table person = mf.getSchema().getTable("Persons");
    assertEquals(3, person.getColumns().size());

    assertNotNull(person.getColumnByName("name"));
    assertNotNull(person.getColumnByName("dob"));
    assertNotNull(person.getColumnByName("ssn"));

    Column name = person.getColumnByName("name");
    Column dob = person.getColumnByName("dob");
    Column ssn = person.getColumnByName("ssn");

    assertEquals("string", name.getDatatype().getRuntimeTypeName());
    assertEquals("timestamp", dob.getDatatype().getRuntimeTypeName());
    assertEquals("long", ssn.getDatatype().getRuntimeTypeName());

    assertTrue(name.getNullType() == NullType.No_Nulls);
    assertTrue(dob.getNullType() == NullType.Nullable);
    assertTrue(ssn.getNullType() == NullType.No_Nulls);

    assertEquals(25, name.getLength());

    assertNotNull(person.getPrimaryKey());

    assertEquals(1, person.getPrimaryKey().getColumns().size());
    assertEquals("ssn", person.getPrimaryKey().getColumns().get(0).getName());

    assertTrue(person.getForeignKeys().isEmpty());
  }
  @Test
  public void testAssosiationWithReferentialContriant() throws Exception {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "northwind",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    CsdlEntityType g1Entity = entityType("g1");
    g1Entity.getProperties().add(createProperty("g2e2", EdmPrimitiveTypeKind.String));
    g1Entity.setKey(Arrays.asList(new CsdlPropertyRef().setName("g2e2")));
    CsdlEntityType g2Entity = entityType("g2");

    CsdlNavigationProperty navProperty = new CsdlNavigationProperty();
    navProperty.setName("one_2_one");
    navProperty.setType("namespace.g2");
    navProperty.setNullable(false);
    navProperty.setPartner("PartnerPath");
    navProperty.setReferentialConstraints(
        Arrays.asList(
            new CsdlReferentialConstraint().setProperty("g2e2").setReferencedProperty("e2")));

    g1Entity.setNavigationProperties(Arrays.asList(navProperty));

    CsdlEntitySet g1Set = createES("G1", "namespace.g1");
    CsdlEntitySet g2Set = createES("G2", "namespace.g2");

    CsdlNavigationPropertyBinding navBinding = new CsdlNavigationPropertyBinding();
    navBinding.setPath("one_2_one");
    navBinding.setTarget("G2");
    g1Set.setNavigationPropertyBindings(Arrays.asList(navBinding));

    XMLMetadata metadata = buildXmlMetadata(g1Entity, g1Set, g2Entity, g2Set);
    processor.getMetadata(mf, metadata);

    Table g1 = mf.getSchema().getTable("G1");
    Table g2 = mf.getSchema().getTable("G2");

    assertNotNull(g1);
    assertNotNull(g2);

    ForeignKey fk = g2.getForeignKeys().get(0);
    assertEquals("one_2_one", fk.getName());
    assertNotNull(fk.getColumnByName("e2"));
    assertEquals("g2e2", fk.getReferenceColumns().get(0));
  }
 static MetadataFactory multiplePKMetadata() throws TranslatorException {
   ODataMetadataProcessor processor = new ODataMetadataProcessor();
   MetadataFactory mf =
       new MetadataFactory(
           "vdb",
           1,
           "northwind",
           SystemMetadata.getInstance().getRuntimeTypeMap(),
           new Properties(),
           null);
   CsdlEntityType entityType = multipleKeyEntityType("g1");
   CsdlEntitySet entitySet = createES("G1", "namespace.g1");
   XMLMetadata metadata = buildXmlMetadata(entityType, entitySet);
   processor.getMetadata(mf, metadata);
   return mf;
 }
  @Test
  public void testMultipleEnititySetWithSameComplexType() throws Exception {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "northwind",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    CsdlComplexType address = complexType("Address");
    XMLMetadata metadata =
        buildXmlMetadata(
            createES("Persons", "namespace.Person"),
            buildPersonEntity(address),
            address,
            createES("Corporate", "namespace.Business"),
            buildBusinessEntity(address));
    processor.getMetadata(mf, metadata);

    assertEquals(5, mf.getSchema().getTables().size());
    assertNotNull(mf.getSchema().getTable("Persons"));
    assertNotNull(mf.getSchema().getTable("Corporate"));
    assertNotNull(mf.getSchema().getTable("Persons_address"));
    assertNotNull(mf.getSchema().getTable("Corporate_address"));

    Table personTable = mf.getSchema().getTable("Persons");
    assertEquals(2, personTable.getColumns().size());

    Table personAddress = mf.getSchema().getTable("Persons_address");
    assertEquals(4, personAddress.getColumns().size());
    ForeignKey fk = personAddress.getForeignKeys().get(0);
    assertNotNull(fk.getColumnByName("ssn"));

    Table businessTable = mf.getSchema().getTable("Corporate");
    assertEquals(1, businessTable.getColumns().size());
    Table corporateAddress = mf.getSchema().getTable("Corporate_address");
    assertEquals(4, corporateAddress.getColumns().size());
    fk = corporateAddress.getForeignKeys().get(0);
    assertNotNull(fk.getColumnByName("name"));
  }
  static MetadataFactory getEntityWithComplexProperty() throws TranslatorException {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "northwind",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    CsdlComplexType address = complexType("Address");
    XMLMetadata metadata =
        buildXmlMetadata(
            createES("Persons", "namespace.Person"), buildPersonEntity(address), address);
    processor.getMetadata(mf, metadata);

    return mf;
  }
  @Test
  public void testSelfJoin() throws Exception {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "northwind",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    CsdlEntityType g1Entity = entityType("g1");

    CsdlNavigationProperty navProperty = new CsdlNavigationProperty();
    navProperty.setName("self");
    navProperty.setType("Collection(namespace.g1)");
    navProperty.setNullable(false);
    navProperty.setPartner("PartnerPath");
    navProperty.setCollection(true);

    g1Entity.setNavigationProperties(Arrays.asList(navProperty));

    CsdlEntitySet g1Set = createES("G1", "namespace.g1");

    CsdlNavigationPropertyBinding navBinding = new CsdlNavigationPropertyBinding();
    navBinding.setPath("self");
    navBinding.setTarget("G1");
    g1Set.setNavigationPropertyBindings(Arrays.asList(navBinding));

    XMLMetadata metadata = buildXmlMetadata(g1Entity, g1Set);
    processor.getMetadata(mf, metadata);

    Table g1 = mf.getSchema().getTable("G1_self");
    assertNotNull(g1);
    assertEquals("self", g1.getForeignKeys().get(0).getName());
    assertNotNull(g1.getForeignKeys().get(0).getColumnByName("G1_e1"));
    assertEquals("self", g1.getNameInSource());
  }
  static MetadataFactory functionMetadata(String name, CsdlReturnType returnType, Object other)
      throws TranslatorException {
    ODataMetadataProcessor processor = new ODataMetadataProcessor();
    MetadataFactory mf =
        new MetadataFactory(
            "vdb",
            1,
            "northwind",
            SystemMetadata.getInstance().getRuntimeTypeMap(),
            new Properties(),
            null);

    CsdlFunction func = function(name, returnType);

    CsdlFunctionImport funcImport = new CsdlFunctionImport();
    funcImport.setFunction(new FullQualifiedName("namespace." + name));
    funcImport.setName(name);

    XMLMetadata metadata = buildXmlMetadata(funcImport, func, other);
    processor.getMetadata(mf, metadata);
    return mf;
  }