Пример #1
0
    public static IEnumerable LookupDataNoSlots(SqlInt16 partsnap, SqlString phkeytable, SqlInt32 numparts, SqlString temp_partid_table_name)
    {
        //string temp_partid_table = "#temp_partid_list";

        List<PosData> idPositionMap = new List<PosData>();
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            // Phkey -> (List of slots in that phkey)
            List<int> phkeyList = new List<int>();
            string rebuildPhkeySlotMapString = "select distinct phkey from " + phkeytable.ToString();
            SqlCommand rebuildPhkeySlotMapCommand = new SqlCommand(rebuildPhkeySlotMapString, connection);
            SqlDataReader mapReader = rebuildPhkeySlotMapCommand.ExecuteReader();
            while (mapReader.Read())
            {
                int phkey = Int32.Parse(mapReader["phkey"].ToString());
                //short slot = Int16.Parse(mapReader["slot"].ToString());
                phkeyList.Add(phkey);
            }
            mapReader.Close();

            string getFoFGroupIDsCommandString = "select partid from " + temp_partid_table_name.ToString();
            SqlCommand getFoFGroupIDsListCommand = new SqlCommand(getFoFGroupIDsCommandString, connection);
            SqlDataReader getFOFGroupIDsReader = getFoFGroupIDsListCommand.ExecuteReader();
            List<Int64> haloPartIDs = new List<Int64>();
            int numlines = 0;
            while (getFOFGroupIDsReader.Read())
            {
                haloPartIDs.Add(Int64.Parse(getFOFGroupIDsReader["partid"].ToString()));
                ++numlines;
            }
            getFOFGroupIDsReader.Close();

            string getActualDataString = "select a.phkey, a.id, a.pos from SimulationDB.dbo.snaparr a, " + phkeytable.ToString() + " b where a.snapnum = @partsnap and a.phkey = b.phkey";
            SqlParameter partsnapParam2 = new SqlParameter("@partsnap", System.Data.SqlDbType.SmallInt);
            partsnapParam2.Value = partsnap;
            SqlCommand getActualDataCommand = new SqlCommand(getActualDataString, connection);
            getActualDataCommand.Parameters.Add(partsnapParam2);
            SqlDataReader dataReader = getActualDataCommand.ExecuteReader();
            while (dataReader.Read())
            {
                List<Int64> ids = new List<Int64>((new SqlBigIntArrayMax(new SqlBytes((byte[])dataReader["id"])).ToArray()));

                SqlRealArrayMax positions = new SqlRealArrayMax(new SqlBytes((byte[])dataReader["pos"]));
                int phkey = Int32.Parse(dataReader["phkey"].ToString());

                float[] posArray = positions.ToArray();
                for (int i = 0; i < haloPartIDs.Count; ++i)
                {
                    int slot = ids.BinarySearch(haloPartIDs[i]);
                    if (slot >= 0)
                    {
                        PosData currentPosComps = new PosData(ids[slot], posArray[slot * 3 + 0], posArray[slot * 3 + 1], posArray[slot * 3 + 2]);
                        haloPartIDs.RemoveAt(i);
                        --i;
                        idPositionMap.Add(currentPosComps);
                    }
                }

            }
            dataReader.Read();
        }
        return idPositionMap;
    }
Пример #2
0
    public static IEnumerable LookupData(SqlInt16 partsnap, SqlString phkeytable)
    {
        //string temp_partid_table = "#temp_partid_list";

        List<PosData> idPositionMap = new List<PosData>();
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            // Phkey -> (List of slots in that phkey)
            Dictionary<int, List<int>> phkeySlotMap = new Dictionary<int, List<int>>();
            string rebuildPhkeySlotMapString = "select phkey, slot from " + phkeytable.ToString();
            SqlCommand rebuildPhkeySlotMapCommand = new SqlCommand(rebuildPhkeySlotMapString, connection);
            SqlDataReader mapReader = rebuildPhkeySlotMapCommand.ExecuteReader();
            while (mapReader.Read())
            {
                int phkey = Int32.Parse(mapReader["phkey"].ToString());
                short slot = Int16.Parse(mapReader["slot"].ToString());
                List<int> slotList = null;
                if (!phkeySlotMap.TryGetValue(phkey, out slotList))
                {
                    slotList = new List<int>();
                }
                slotList.Add(slot);
                phkeySlotMap[phkey] = slotList;
            }
            mapReader.Close();

            string getActualDataString = "select distinct a.phkey, a.id, a.pos from SimulationDB.dbo.snaparr a, " + phkeytable.ToString() + " b where a.snapnum = @partsnap and a.phkey = b.phkey";
            SqlParameter partsnapParam2 = new SqlParameter("@partsnap", System.Data.SqlDbType.SmallInt);
            partsnapParam2.Value = partsnap;
            SqlCommand getActualDataCommand = new SqlCommand(getActualDataString, connection);
            getActualDataCommand.Parameters.Add(partsnapParam2);
            SqlDataReader dataReader = getActualDataCommand.ExecuteReader();
            while (dataReader.Read())
            {
                long[] ids = (new SqlBigIntArrayMax(new SqlBytes((byte[])dataReader["id"])).ToArray());
                SqlRealArrayMax positions = new SqlRealArrayMax(new SqlBytes((byte[])dataReader["pos"]));
                int phkey = Int32.Parse(dataReader["phkey"].ToString());
                //int[][] currentSlots = {(phkeySlotMap[phkey].ToArray())};
                //ids.GetItems(currentSlots);
                //int[] lengths = { ids.Length, 3 };
                //positions.Reshape(lengths);
                //int[] lengths[
                float[] posArray = positions.ToArray();
                foreach (short slot in phkeySlotMap[phkey])
                {
                    //PosData currentPosComps = new PosData(ids[slot], posArray[slot, 0], posArray[slot, 1], posArray[slot, 2]);
                    PosData currentPosComps = new PosData(ids[slot], posArray[slot * 3 + 0], posArray[slot * 3 + 1], posArray[slot * 3 + 2]);
                    idPositionMap.Add(currentPosComps);
                }
            }
            dataReader.Close();
        }
        return idPositionMap;
    }
Пример #3
0
    public static IEnumerable LookupDataAllTimesteps(SqlString phkeytable)
    {
        //string temp_partid_table = "#temp_partid_list";

        List<PosDataWithSnap> idPositionMap = new List<PosDataWithSnap>();
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            // Phkey -> (List of slots in that phkey)
            List<Dictionary<int, List<int>>> phkeySlotMap = new List<Dictionary<int, List<int>>>();
            // initialize dictionaries for all timesteps
            for (int i = 0; i < 64; ++i)
            {
                phkeySlotMap.Add(new Dictionary<int, List<int>>());
            }
            string rebuildPhkeySlotMapString = "select snap, phkey, slot from " + phkeytable.ToString();
            SqlCommand rebuildPhkeySlotMapCommand = new SqlCommand(rebuildPhkeySlotMapString, connection);
            SqlDataReader mapReader = rebuildPhkeySlotMapCommand.ExecuteReader();
            while (mapReader.Read())
            {
                int snap = Int32.Parse(mapReader["snap"].ToString());
                int phkey = Int32.Parse(mapReader["phkey"].ToString());
                short slot = Int16.Parse(mapReader["slot"].ToString());
                List<int> slotList = null;
                if (!phkeySlotMap[snap].TryGetValue(phkey, out slotList))
                {
                    slotList = new List<int>();
                }
                slotList.Add(slot);
                phkeySlotMap[snap][phkey] = slotList;
            }
            mapReader.Close();

            // TODO: the faster way to do this might be to do each timestep separately, I think we will stay in memory that way???
            // I should figure out what the bottleneck here is though

            #region one_snap_at_a_time
            /*string getActualDataStringRaw = "select distinct a.phkey, a.id, a.pos from SimulationDB.dbo.snaparr a, "
                + phkeytable.ToString() + " b where a.snapnum = b.snap and a.phkey = b.phkey and a.snapnum = {0}";
            for (short currentSnap = 0; currentSnap < 64; ++currentSnap)
            {
                string getActualDataString = string.Format(getActualDataStringRaw, currentSnap);
                SqlCommand getActualDataCommand = new SqlCommand(getActualDataString, connection);
                SqlDataReader dataReader = getActualDataCommand.ExecuteReader();
                while (dataReader.Read())
                {
                    long[] ids = (new SqlBigIntArrayMax(new SqlBytes((byte[])dataReader["id"])).ToArray());
                    SqlRealArrayMax positions = new SqlRealArrayMax(new SqlBytes((byte[])dataReader["pos"]));
                    int phkey = Int32.Parse(dataReader["phkey"].ToString());
                    float[] posArray = positions.ToArray();
                    foreach (short slot in phkeySlotMap[currentSnap][phkey])
                    {
                        //PosData currentPosComps = new PosData(ids[slot], posArray[slot, 0], posArray[slot, 1], posArray[slot, 2]);
                        PosDataWithSnap currentPosComps = new PosDataWithSnap(currentSnap, ids[slot], posArray[slot * 3 + 0], posArray[slot * 3 + 1], posArray[slot * 3 + 2]);
                        idPositionMap.Add(currentPosComps);
                    }
                }
                dataReader.Close();
            }*/
            #endregion one_snap_at_a_time

            #region all_at_once
            string getActualDataString = "select distinct a.snapnum, a.phkey, a.id, a.pos from SimulationDB.dbo.snaparr a, "
                + phkeytable.ToString() + " b where a.snapnum = b.snap and a.phkey = b.phkey order by a.snapnum";

            SqlCommand getActualDataCommand = new SqlCommand(getActualDataString, connection);
            SqlDataReader dataReader = getActualDataCommand.ExecuteReader();
            while (dataReader.Read())
            {
                short snap = Int16.Parse(dataReader["snapnum"].ToString());
                long[] ids = (new SqlBigIntArrayMax(new SqlBytes((byte[])dataReader["id"])).ToArray());
                SqlRealArrayMax positions = new SqlRealArrayMax(new SqlBytes((byte[])dataReader["pos"]));
                int phkey = Int32.Parse(dataReader["phkey"].ToString());
                float[] posArray = positions.ToArray();
                foreach (short slot in phkeySlotMap[snap][phkey])
                {
                    //PosData currentPosComps = new PosData(ids[slot], posArray[slot, 0], posArray[slot, 1], posArray[slot, 2]);
                    PosDataWithSnap currentPosComps = new PosDataWithSnap(snap, ids[slot], posArray[slot * 3 + 0], posArray[slot * 3 + 1], posArray[slot * 3 + 2]);
                    idPositionMap.Add(currentPosComps);
                }
            }
            dataReader.Close();

            #endregion all_at_once

        }
        return idPositionMap;
    }