# LegacyIndexDefinition.java

    /*
     ** Module   : LegacyIndexDefinition.java
     ** Abstract : A container for a table index metadata.
     **
     ** Copyright (c) 2025, Golden Code Development Corporation.
     **
     ** -#- -I- --Date-- ---------------------------------------Description---------------------------------------
     ** 001  AS   20250217 Created initial version.
     */

    /*
     ** This program is free software: you can redistribute it and/or modify
     ** it under the terms of the GNU Affero General Public License as
     ** published by the Free Software Foundation, either version 3 of the
     ** License, or (at your option) any later version.
     **
     ** This program is distributed in the hope that it will be useful,
     ** but WITHOUT ANY WARRANTY; without even the implied warranty of
     ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     ** GNU Affero General Public License for more details.
     **
     ** You may find a copy of the GNU Affero GPL version 3 at the following
     ** location: https://www.gnu.org/licenses/agpl-3.0.en.html
     **
     ** Additional terms under GNU Affero GPL version 3 section 7:
     **
     **   Under Section 7 of the GNU Affero GPL version 3, the following additional
     **   terms apply to the works covered under the License.  These additional terms
     **   are non-permissive additional terms allowed under Section 7 of the GNU
     **   Affero GPL version 3 and may not be removed by you.
     **
     **   0. Attribution Requirement.
     **
     **     You must preserve all legal notices or author attributions in the covered
     **     work or Appropriate Legal Notices displayed by works containing the covered
     **     work.  You may not remove from the covered work any author or developer
     **     credit already included within the covered work.
     **
     **   1. No License To Use Trademarks.
     **
     **     This license does not grant any license or rights to use the trademarks
     **     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
     **     of Golden Code Development Corporation. You are not authorized to use the
     **     name Golden Code, FWD, or the names of any author or contributor, for
     **     publicity purposes without written authorization.
     **
     **   2. No Misrepresentation of Affiliation.
     **
     **     You may not represent yourself as Golden Code Development Corporation or FWD.
     **
     **     You may not represent yourself for publicity purposes as associated with
     **     Golden Code Development Corporation, FWD, or any author or contributor to
     **     the covered work, without written authorization.
     **
     **   3. No Misrepresentation of Source or Origin.
     **
     **     You may not represent the covered work as solely your work.  All modified
     **     versions of the covered work must be marked in a reasonable way to make it
     **     clear that the modified work is not originating from Golden Code Development
     **     Corporation or FWD.  All modified versions must contain the notices of
     **     attribution required in this license.
     */

    package com.goldencode.p2j.persist;

    import static com.goldencode.util.NativeTypeSerializer.*;
    import java.io.*;
    import java.util.*;
    import java.util.stream.*;
    import com.goldencode.p2j.persist.TableMapper.*;
    import com.goldencode.p2j.util.*;

    /**
     * Helper class to provide details about a index's metadata.
     */
    public class LegacyIndexDefinition
    {
        /** The legacy name of this index. */
        private String legacyName;

        /** A flag indicating that the index is primary unique, if false, the index is just unique.*/
        private boolean primaryUnique;

        /** Index components (fields). */
        private List<String> components;

        /**
         * Default c'tor
         */
        public LegacyIndexDefinition()
        {
        }

        /**
         * Parameterized constructor.
         *
         * @param   legacyName
         *          The legacy name of the index.
         * @param   primaryUnique
         *          Indicates if the index is bot primary and unique, if false, the index is just unique.
         * @param   components
         *          The fields that are part of the index.
         */
        public LegacyIndexDefinition(String legacyName, boolean primaryUnique, List<String> components)
        {
            this.legacyName = legacyName;
            this.primaryUnique = primaryUnique;
            this.components = components;
        }

        /**
         * A getter method for the legacyName attribute.
         *
         * @return   The legacyName attribute.
         */
        public String getLegacyName()
        {
            return legacyName;
        }

        /**
         * A setter method for the legacyName attribute.
         *
         * @param   legacyName
         *          The name of the index.
         */
        public void setLegacyName(String legacyName)
        {
            this.legacyName = legacyName;
        }

        /**
         * A getter method for the primaryUnique attribute.
         *
         * @return   The primaryUnique attribute.
         */
        public boolean isPrimaryUnique()
        {
            return primaryUnique;
        }

        /**
         * A setter method for the legacyName attribute.
         *
         * @param   primaryUnique
         *          A flag indicating that the index is primary unique,
         *          if false, the index is just unique.
         */
        public void setPrimaryUnique(boolean primaryUnique)
        {
            this.primaryUnique = primaryUnique;
        }

        /**
         * A getter method for the components attribute.
         *
         * @return   The components attribute.
         */
        public List<String> getComponents()
        {
            return components;
        }

        /**
         * A setter method for the legacyName attribute.
         *
         * @param   components
         *          Index components (fields).
         */
        public void setComponents(List<String> components)
        {
            this.components = components;
        }

        /**
         * toString override for a LegacyIndexDefinition object.
         *
         * @return The string representation of a LegacyIndexDefinition object.
         */
        @Override
        public String toString() {
            return "LegacyIndexDefinition{" +
                    "legacyName='" + legacyName + '\'' +
                    ", primaryUnique=" + primaryUnique +
                    ", components=" + components +
                    '}';
        }

        /**
         * equals override of a LegacyIndexDefinition object.
         * This method ignores the case of the string components name
         * and the legacy name of the index.
         *
         * @param   o
         *          The object to compare to this instance of the LegacyIndexDefinition.
         * @return   True if the two objects are equal.
         */
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            LegacyIndexDefinition that = (LegacyIndexDefinition) o;
            for (int i = 0; i < this.components.size(); i++)
            {
                if (!this.components.get(i).equalsIgnoreCase(that.components.get(i)))
                {
                    return false;
                }
            }
            return primaryUnique == that.primaryUnique && this.legacyName.equalsIgnoreCase(that.legacyName);
        }

        /**
         * hashCode override for a LegacyIndexDefinition object.
         *
         * @return   The int hashcode for a LegacyIndexDefinition object.
         */
        @Override
        public int hashCode() {
            return Objects.hash(legacyName, primaryUnique, components);
        }
    }