Shaw Young created AVRO-4094:
--------------------------------

             Summary: Namespaces not mapped in type references
                 Key: AVRO-4094
                 URL: https://issues.apache.org/jira/browse/AVRO-4094
             Project: Apache Avro
          Issue Type: Bug
          Components: csharp
    Affects Versions: 1.11.4
         Environment: Avrogen is being run against dotnet 8 c# code from the 
linux command line.
            Reporter: Shaw Young


Given this avsc schema file
{code:java}
[
  {
      "type": "enum",
      "name": "Planets",
      "namespace": "myapp.account",
      "symbols": [
        "EARTH",
        "MARS",
        "VENUS",
        "MERCURY"
      ],
      "doc": "Planets of the solar system"
  },
  {
    "type": "record",
    "name": "AccountCreation",
    "namespace": "myapp.account",
    "doc": "A individual user of the system.",
    "fields": [
      {
        "name": "id",
        "type": "string",
        "doc": "The unique identifier for the user."
      },
      {
        "name": "name",
        "type": [
          "null",
          "string"
        ],
        "default": null,
        "doc": ""
      },
      {
        "name": "homePlanet",
        "type": "Planets",
        "doc": ""
      },
      {
        "name": "favouritePlanet",
        "type": [
          "null",
          "Planets"
        ],
        "default": null,
        "doc": ""
      }
    ]
  }
] {code}
and the avrogen with the following parameters;
{code:java}
avrogen -s ./simple.avsc ./out --namespace myapp.account:MyApp.Account{code}
Everything is generated as expected;
{code:java}
out
└── App
    └── Account
        ├── AccountCreation.cs
        └── Planets.cs {code}
Now consider a minor alteration of moving Planets into its own common namespace 
so it can reused- we still wish to reference it from the AccountCreation entity 
by simply adding the namespace to the type;
{code:java}
[
  {
      "type": "enum",
      "name": "Planets",
      "namespace": "myapp.common",
      "symbols": [
        "EARTH",
        "MARS",
        "VENUS",
        "MERCURY"
      ],
      "doc": "Planets of the solar system"
  },
  {
    "type": "record",
    "name": "AccountCreation",
    "namespace": "myapp.account",
    "doc": "A individual user of the system.",
    "fields": [
      {
        "name": "id",
        "type": "string",
        "doc": "The unique identifier for the user."
      },
      {
        "name": "name",
        "type": [
          "null",
          "string"
        ],
        "default": null,
        "doc": ""
      },
      {
        "name": "homePlanet",
        "type": "myapp.common.Planets",
        "doc": ""
      },
      {
        "name": "favouritePlanet",
        "type": [
          "null",
          "myapp.common.Planets"
        ],
        "default": null,
        "doc": ""
      }
    ]
  }
] {code}
Including the extra namespace mapping when running avrogen;
{code:java}
avrogen -s ./demo.avsc ./out --namespace myapp.common:App.Common --namespace 
myapp.account:MyApp.Account{code}
This run fails
{code:java}
Exception occurred. Undefined name: myapp.common.Planets at 
'[1].fields[2].type'{code}
Looking at the code it looks like the preparse step will substitute namespace 
attributes using the collection of namespace mapping, but doesn't substitute 
any of the type mappings, if they include one of the mapped namespaces.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to