You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@daffodil.apache.org by "Sloane, Brandon" <bs...@tresys.com> on 2019/04/12 22:17:00 UTC

NodeInfo confusion

I am looking at the type hierarchy defined in NodeInfo and am confused about the Integer type.


In NodeInfo.scala we have:


    protected sealed trait IntegerKind extends SignedInteger.Kind
    case object Integer extends PrimTypeNode(Decimal, List(Long, NonNegativeInteger)) with IntegerKind {
      type Kind = IntegerKind
      override def fromXMLString(s: String) = new JBigInt(s)
    }

In the above code, the second line declares that Decimal is the parent type of Integer.

However, within the scala type-system, SignedInteger is the supertype of Integer (as declared in the first line).

My understanding is that the type hierarchy of NodeInfo is intended to match their Scala type hierarchy.


The context where this is coming up is that I need to find a type that will serve as a supertype (in the sense that NodeInfo defines) for all integer types.


Brandon T. Sloane

Associate, Services

bsloane@tresys.com | tresys.com

Re: NodeInfo confusion

Posted by "Beckerle, Mike" <mb...@tresys.com>.
I think you are right. SignedInteger probably seemed like a useful trait/base, but really is a mistake given that Integer is signed.

________________________________
From: Sloane, Brandon <bs...@tresys.com>
Sent: Monday, April 15, 2019 2:00:59 PM
To: dev@daffodil.apache.org
Subject: Re: NodeInfo confusion

I believe my issue is stemming from the SignedInteger type, which I cannot find any reference of outside of the Daffodil source (so I assume is one of the extra nodes you refer to.


In particular, the definition of SignedInteger is:


  protected sealed trait SignedIntegerKind extends SignedNumeric.Kind
  case object SignedInteger extends TypeNode(SignedNumeric, List(Integer)) with SignedIntegerKind {
    type Kind = SignedIntegerKind
  }


Which indicates that we should have the type hierarchy:


SignedNumeric

         |

SignedInteger

         |

Integer


However, Integer, Decimal and SignedNumeric say:


    case object Integer extends PrimTypeNode(Decimal, List(Long, NonNegativeInteger)) with IntegerKind {
      type Kind = IntegerKind
      override def fromXMLString(s: String) = new JBigInt(s)
    }


    case object Decimal extends PrimTypeNode(SignedNumeric, List(Integer)) with DecimalKind {
      type Kind = DecimalKind
      override def fromXMLString(s: String) = new JBigDecimal(s)
    }

  case object SignedNumeric extends TypeNode(Numeric, List(Float, Double, Decimal, SignedInteger)) with SignedNumericKind {
    type Kind = SignedNumericKind
  }

Which suggests a hierarchy of

SignedNumeric
       |                       |
Decimal , ....., SignedInteger
       |

 Integer


So the relationship between Integer and SignedInteger is inconsistent. SignedInteger believes itself to be a supertype of Integer, but Integer does not believe itself to be a subtype of SignedInteger


Skimming through the codebase, it is not clear to me what the purpose of SignedInteger is. Under the standard XSD definition, xsd:Integer is already a signed type. And, apart from introducing itself (inconsistently) to the type hierarchy, the only usage I can find is in the guard of a case structure, wher I believe we should be able to replace it with just Integer and not change any result


Having said all of that, my problems go away if I replace SignedInteger with Integer in the code I am adding with just Integer. This is consistent with my hypothesis that SignedInteger is never actually used (beyond as a glorified alias to Integer in the scala type system).

________________________________
From: Beckerle, Mike <mb...@tresys.com>
Sent: Friday, April 12, 2019 7:21:52 PM
To: dev@daffodil.apache.org
Subject: Re: NodeInfo confusion

Type system matches the dfdl/XML schema type system, not the scala type system, but has some extra nodes that are there for convenience also.

In dfdl/XML decimal is super type of integer.





Get Outlook for Android<https://aka.ms/ghei36>



From: Sloane, Brandon
Sent: Friday, April 12, 6:17 PM
Subject: NodeInfo confusion
To: dev@daffodil.apache.org


I am looking at the type hierarchy defined in NodeInfo and am confused about the Integer type. In NodeInfo.scala we have: protected sealed trait IntegerKind extends SignedInteger.Kind case object Integer extends PrimTypeNode(Decimal, List(Long, NonNegativeInteger)) with IntegerKind { type Kind = IntegerKind override def fromXMLString(s: String) = new JBigInt(s) } In the above code, the second line declares that Decimal is the parent type of Integer. However, within the scala type-system, SignedInteger is the supertype of Integer (as declared in the first line). My understanding is that the type hierarchy of NodeInfo is intended to match their Scala type hierarchy. The context where this is coming up is that I need to find a type that will serve as a supertype (in the sense that NodeInfo defines) for all integer types. Brandon T. Sloane Associate, Services bsloane@tresys.com | tresys.com


Re: NodeInfo confusion

Posted by "Sloane, Brandon" <bs...@tresys.com>.
I believe my issue is stemming from the SignedInteger type, which I cannot find any reference of outside of the Daffodil source (so I assume is one of the extra nodes you refer to.


In particular, the definition of SignedInteger is:


  protected sealed trait SignedIntegerKind extends SignedNumeric.Kind
  case object SignedInteger extends TypeNode(SignedNumeric, List(Integer)) with SignedIntegerKind {
    type Kind = SignedIntegerKind
  }


Which indicates that we should have the type hierarchy:


SignedNumeric

         |

SignedInteger

         |

Integer


However, Integer, Decimal and SignedNumeric say:


    case object Integer extends PrimTypeNode(Decimal, List(Long, NonNegativeInteger)) with IntegerKind {
      type Kind = IntegerKind
      override def fromXMLString(s: String) = new JBigInt(s)
    }


    case object Decimal extends PrimTypeNode(SignedNumeric, List(Integer)) with DecimalKind {
      type Kind = DecimalKind
      override def fromXMLString(s: String) = new JBigDecimal(s)
    }

  case object SignedNumeric extends TypeNode(Numeric, List(Float, Double, Decimal, SignedInteger)) with SignedNumericKind {
    type Kind = SignedNumericKind
  }

Which suggests a hierarchy of

SignedNumeric
       |                       |
Decimal , ....., SignedInteger
       |

 Integer


So the relationship between Integer and SignedInteger is inconsistent. SignedInteger believes itself to be a supertype of Integer, but Integer does not believe itself to be a subtype of SignedInteger


Skimming through the codebase, it is not clear to me what the purpose of SignedInteger is. Under the standard XSD definition, xsd:Integer is already a signed type. And, apart from introducing itself (inconsistently) to the type hierarchy, the only usage I can find is in the guard of a case structure, wher I believe we should be able to replace it with just Integer and not change any result


Having said all of that, my problems go away if I replace SignedInteger with Integer in the code I am adding with just Integer. This is consistent with my hypothesis that SignedInteger is never actually used (beyond as a glorified alias to Integer in the scala type system).

________________________________
From: Beckerle, Mike <mb...@tresys.com>
Sent: Friday, April 12, 2019 7:21:52 PM
To: dev@daffodil.apache.org
Subject: Re: NodeInfo confusion

Type system matches the dfdl/XML schema type system, not the scala type system, but has some extra nodes that are there for convenience also.

In dfdl/XML decimal is super type of integer.





Get Outlook for Android<https://aka.ms/ghei36>



From: Sloane, Brandon
Sent: Friday, April 12, 6:17 PM
Subject: NodeInfo confusion
To: dev@daffodil.apache.org


I am looking at the type hierarchy defined in NodeInfo and am confused about the Integer type. In NodeInfo.scala we have: protected sealed trait IntegerKind extends SignedInteger.Kind case object Integer extends PrimTypeNode(Decimal, List(Long, NonNegativeInteger)) with IntegerKind { type Kind = IntegerKind override def fromXMLString(s: String) = new JBigInt(s) } In the above code, the second line declares that Decimal is the parent type of Integer. However, within the scala type-system, SignedInteger is the supertype of Integer (as declared in the first line). My understanding is that the type hierarchy of NodeInfo is intended to match their Scala type hierarchy. The context where this is coming up is that I need to find a type that will serve as a supertype (in the sense that NodeInfo defines) for all integer types. Brandon T. Sloane Associate, Services bsloane@tresys.com | tresys.com


Re: NodeInfo confusion

Posted by "Beckerle, Mike" <mb...@tresys.com>.
Type system matches the dfdl/XML schema type system, not the scala type system, but has some extra nodes that are there for convenience also.

In dfdl/XML decimal is super type of integer.





Get Outlook for Android<https://aka.ms/ghei36>



From: Sloane, Brandon
Sent: Friday, April 12, 6:17 PM
Subject: NodeInfo confusion
To: dev@daffodil.apache.org


I am looking at the type hierarchy defined in NodeInfo and am confused about the Integer type. In NodeInfo.scala we have: protected sealed trait IntegerKind extends SignedInteger.Kind case object Integer extends PrimTypeNode(Decimal, List(Long, NonNegativeInteger)) with IntegerKind { type Kind = IntegerKind override def fromXMLString(s: String) = new JBigInt(s) } In the above code, the second line declares that Decimal is the parent type of Integer. However, within the scala type-system, SignedInteger is the supertype of Integer (as declared in the first line). My understanding is that the type hierarchy of NodeInfo is intended to match their Scala type hierarchy. The context where this is coming up is that I need to find a type that will serve as a supertype (in the sense that NodeInfo defines) for all integer types. Brandon T. Sloane Associate, Services bsloane@tresys.com | tresys.com