// ============================================================================
// ==============================================================================
__int64 GetMotionReducedIndex(__int64 i64Index,
                              const std::map<int, int> &mapLookTrans,
                              const std::map<int, int> &mapWeaponMotionTrans)
{
    //~~~~~~~~~~~~~~~~~~
    int nLook = 0;
    int nWeaponMotion = 0;
    //~~~~~~~~~~~~~~~~~~

    GetIndexInfo(i64Index, nLook, nWeaponMotion);

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    const std::map<int, int>::const_iterator itLook = mapLookTrans.find(nLook);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    if (itLook == mapLookTrans.end()) {
        return 0;
    }

    nLook = itLook->second;

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    const std::map<int, int>::const_iterator itWeapon = mapWeaponMotionTrans.find(nWeaponMotion);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    if (itWeapon == mapWeaponMotionTrans.end()) {
        return 0;
    }

    nWeaponMotion = itWeapon->second;
    i64Index = ComboIndexInfo(nLook, nWeaponMotion);
    return i64Index;
}
void
TableProperties::GetIndexList()
{
	char* sql = sqlite3_mprintf("PRAGMA index_list([%q]);", fTableName.String());

	RecordSet* rs = GlobalSQLMgr->OpenRecordSet(sql);
	
	while(rs->Step())
	{
		IndexProperties index;
		index.fName = BString(rs->ColumnText(1));
		index.fIsUnique = (strcmp(rs->ColumnText(2), "0") ? true : false);

		GetIndexInfo(index);
	}

	rs->Close();
	sqlite3_free(sql);
}
// ============================================================================
// ==============================================================================
bool AdvanceReduce(const std::map<__int64, std::string> &rMapOrgInfo,
                   const std::vector<FORMAT_RES_DATA> &vecResData,
                   std::map<__int64, std::string> &mapNewIndex,
                   std::map<int, int> &mapLookTrans,
                   std::map<int, int> &mapWeaponMotionTrans)
{
    mapNewIndex.clear();

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    std::vector<FORMAT_RES_DATA>::const_iterator it = vecResData.begin();
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    for (; it != vecResData.end(); ++it) {

        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        const FORMAT_RES_DATA &rData = *it;
        const std::vector<__int64> &rVecIndex = rData.vecIndex;
        __int64 i64IndexRes = ResPathTransIndex(rData.strRes);
        bool bIndexResOk = true;
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        if (i64IndexRes <= 0) {
            bIndexResOk = false;
        }

        if (bIndexResOk) {

            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            std::map<__int64, std::string>::const_iterator it = rMapOrgInfo.find(i64IndexRes);
            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            if (it == rMapOrgInfo.end() || it->second != rData.strRes) {
                bIndexResOk = false;
            }
        }

        if (!bIndexResOk) {

            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            std::vector<__int64>::const_iterator itIndex = rVecIndex.begin();
            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            for (; itIndex != rVecIndex.end(); ++itIndex) {

                //~~~~~~~~~~~~~~~~~~~~~~~~
                __int64 i64Index = *itIndex;
                //~~~~~~~~~~~~~~~~~~~~~~~~

                if (REDUCE_VERSION > 1) {

                    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    __int64 i64IndexRuleTrans = MountRuleTrans(i64Index);
                    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    if (i64IndexRuleTrans != i64Index) {

                        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        const std::map<__int64, std::string>::const_iterator itRule = rMapOrgInfo.find(i64IndexRuleTrans);
                        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        if (itRule != rMapOrgInfo.end() && itRule->second == rData.strRes) {
                            continue;
                        }
                    }
                }

                mapNewIndex[i64Index] = rData.strRes;
            }
        } else {
            mapNewIndex[i64IndexRes] = rData.strRes;

            //~~~~~~~~~~~~~~~~~~~~~
            int nResLook = 0;
            int nResWeaponMotion = 0;
            //~~~~~~~~~~~~~~~~~~~~~

            GetIndexInfo(i64IndexRes, nResLook, nResWeaponMotion);

            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            std::vector<__int64>::const_iterator itIndex = rVecIndex.begin();
            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            for (; itIndex != rVecIndex.end(); ++itIndex) {

                //~~~~~~~~~~~~~~~~~~~~~~~~
                int nIndexLook = 0;
                int nIndexWeaponMotion = 0;
                __int64 i64Index = *itIndex;
                //~~~~~~~~~~~~~~~~~~~~~~~~

                if (REDUCE_VERSION > 1) {

                    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    __int64 i64IndexRuleTrans = MountRuleTrans(i64Index);
                    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    if (i64IndexRuleTrans != i64Index) {

                        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        const std::map<__int64, std::string>::const_iterator itRule = rMapOrgInfo.find(i64IndexRuleTrans);
                        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        if (itRule != rMapOrgInfo.end() && itRule->second == rData.strRes) {
                            continue;
                        }
                    }
                }

                GetIndexInfo(i64Index, nIndexLook, nIndexWeaponMotion);

                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                std::map<int, int>::const_iterator itFind;
                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                itFind = mapLookTrans.find(nIndexLook);
                if (itFind == mapLookTrans.end()) {
                    mapLookTrans[nIndexLook] = nResLook;
                }

                if (mapLookTrans[nIndexLook] != nResLook) {
                    mapNewIndex[i64Index] = rData.strRes;
                    continue;
                }

                itFind = mapWeaponMotionTrans.find(nIndexWeaponMotion);
                if (itFind == mapWeaponMotionTrans.end()) {
                    mapWeaponMotionTrans[nIndexWeaponMotion] = nResWeaponMotion;
                }

                if (mapWeaponMotionTrans[nIndexWeaponMotion] != nResWeaponMotion) {
                    mapNewIndex[i64Index] = rData.strRes;
                }
            }
        }
    }

    printf("ReduceVer %d End %d %d %d\n", REDUCE_VERSION, mapNewIndex.size(), mapLookTrans.size(),
           mapWeaponMotionTrans.size());
    return true;
}
// ============================================================================
// ==============================================================================
bool CalcTransTable(const std::vector<FORMAT_RES_DATA> &vecResData,
                    std::map<int, int> &mapLookTrans,
                    std::map<int, int> &mapWeaponMotionTrans)
{
    mapLookTrans.clear();
    mapWeaponMotionTrans.clear();

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    std::vector<FORMAT_RES_DATA>::const_iterator it = vecResData.begin();
    std::map<int, std::map<int, int> > mapLookTransCount;
    std::map<int, std::map<int, int> > mapWeaponMotionTransCount;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    for (; it != vecResData.end(); ++it) {

        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        const FORMAT_RES_DATA &rData = *it;
        const std::vector<__int64> &rVecIndex = rData.vecIndex;
        __int64 i64IndexRes = ResPathTransIndex(rData.strRes);
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        if (i64IndexRes > 0) {

            //~~~~~~~~~~~~~~~~~~~~~
            int nResLook = 0;
            int nResWeaponMotion = 0;
            //~~~~~~~~~~~~~~~~~~~~~

            GetIndexInfo(i64IndexRes, nResLook, nResWeaponMotion);

            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            std::vector<__int64>::const_iterator itIndex = rVecIndex.begin();
            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            for (; itIndex != rVecIndex.end(); ++itIndex) {

                //~~~~~~~~~~~~~~~~~~~~~~~~
                int nIndexLook = 0;
                int nIndexWeaponMotion = 0;
                __int64 i64Index = *itIndex;
                //~~~~~~~~~~~~~~~~~~~~~~~~

                GetIndexInfo(i64Index, nIndexLook, nIndexWeaponMotion);
                ++mapLookTransCount[nIndexLook][nResLook];
                ++mapWeaponMotionTransCount[nIndexWeaponMotion][nResWeaponMotion];
            }
        }
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    std::map<int, std::map<int, int> >::const_iterator itMap;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    for (itMap = mapLookTransCount.begin(); itMap != mapLookTransCount.end(); ++itMap) {

        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        std::map<int, int>::const_iterator it;
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        for (it = itMap->second.begin(); it != itMap->second.end(); ++it) {
            mapLookTrans[itMap->first] = CalMapMaxSecondFirst(itMap->second);
        }
    }

    for (itMap = mapWeaponMotionTransCount.begin(); itMap != mapWeaponMotionTransCount.end(); ++itMap) {

        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        std::map<int, int>::const_iterator it;
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        for (it = itMap->second.begin(); it != itMap->second.end(); ++it) {
            mapWeaponMotionTrans[itMap->first] = CalMapMaxSecondFirst(itMap->second);
        }
    }

    return true;
}