content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to you under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.calcite.sql.type;
  
  import org.apache.calcite.rel.type.RelDataTypeComparability;
  import org.apache.calcite.rel.type.RelDataTypeFamily;
  import org.apache.calcite.rel.type.RelDataTypeField;
  import org.apache.calcite.sql.SqlIdentifier;
  
  import org.checkerframework.checker.nullness.qual.Nullable;
  
  import java.util.List;
  
  /**
   * ObjectSqlType represents an SQL structured user-defined type.
   */
  public class ObjectSqlType extends AbstractSqlType {
    //~ Instance fields --------------------------------------------------------
  
    private final @Nullable SqlIdentifier sqlIdentifier;
  
    private final RelDataTypeComparability comparability;
  
    private @Nullable RelDataTypeFamily family;
  
    //~ Constructors -----------------------------------------------------------
  
    /**
     * Constructs an object type. This should only be called from a factory
     * method.
     *
     * @param typeName      SqlTypeName for this type (either Distinct or
     *                      Structured)
     * @param sqlIdentifier identifier for this type
     * @param nullable      whether type accepts nulls
     * @param fields        object attribute definitions
     */
    public ObjectSqlType(
        SqlTypeName typeName,
        @Nullable SqlIdentifier sqlIdentifier,
        boolean nullable,
        List<? extends RelDataTypeField> fields,
        RelDataTypeComparability comparability) {
      super(typeName, nullable, fields);
      this.sqlIdentifier = sqlIdentifier;
      this.comparability = comparability;
      computeDigest();
    }
  
    //~ Methods ----------------------------------------------------------------
  
    public void setFamily(RelDataTypeFamily family) {
      this.family = family;
    }
  
    @Override public RelDataTypeComparability getComparability() {
      return comparability;
    }
  
    @Override public @Nullable SqlIdentifier getSqlIdentifier() {
      return sqlIdentifier;
    }
  
    @Override public RelDataTypeFamily getFamily() {
      // each UDT is in its own lonely family, until one day when
      // we support inheritance (at which time also need to implement
      // getPrecedenceList).
      RelDataTypeFamily family = this.family;
      return family != null ? family : this;
    }
  
    @Override protected void generateTypeString(StringBuilder sb, boolean withDetail) {
      // TODO jvs 10-Feb-2005:  proper quoting; dump attributes withDetail?
      sb.append("ObjectSqlType(");
      sb.append(sqlIdentifier);
      sb.append(")");
    }
  }
  