//<--------------------------------Retrieves DBElement from database.
 XElement get_value <Key, Data>(XElement request_msg, DBEngine <Key, DBElement <Key, Data> > db)
 {
     Console.Write("\n  Request to Query for DB Element ");
     try
     {
         Key k = (Key)Convert.ChangeType(request_msg.Element("Key").Value, typeof(Key));
         Console.WriteLine(" with key - {0}", k);
         DBElement <Key, Data> elem = new DBElement <Key, Data>();
         elem = sendQuery.findValue <Key, DBElement <Key, Data>, Data>(db, k);
         if (elem == null)
         {
             XElement response_msg = new XElement("Query_Response");
             XElement type         = new XElement("Query_Type", "Get Value");
             string   rst          = "Could not find element with key - " + k.ToString() + " in database.";
             XElement result       = new XElement("Result", rst);
             response_msg.Add(type);
             response_msg.Add(result);
             return(response_msg);
         }
         else
         {
             XElement response_msg = new XElement("Query_Response");
             XElement type         = new XElement("Query_Type", "Get Value");
             XElement result       = new XElement("Result", "Success");
             string   payload      = "  Payload of DBElement with key - " + k.ToString() + " = " + elem.payload;
             XElement par          = new XElement("Partial", payload);
             XElement com          = new XElement("Complete");
             string   nam          = "  Name: " + elem.name + "\n";
             XElement name         = new XElement("Name", nam);
             string   desc         = "  Description: " + elem.descr + "\n";
             XElement descr        = new XElement("Description", desc);
             string   tm_stmp      = "  TimeStamp: " + elem.timeStamp.ToString() + "\n";
             XElement time         = new XElement("Time", tm_stmp);
             com.Add(name);
             com.Add(descr);
             com.Add(time);
             response_msg.Add(type);
             response_msg.Add(result);
             response_msg.Add(par);
             response_msg.Add(com);
             return(response_msg);
         }
     }
     catch (Exception)
     {
         Console.WriteLine("\n  XML file for request message is not in the expected format. A particular tag could not be found.");
         XElement response_msg = new XElement("Result", "Could not insert element into database");
         return(request_msg);
     }
 }
        static void Main(string[] args)
        {
            "Testing QueryEngine Package".title('=');
            WriteLine();
            QueryEngine sendQuery = new QueryEngine();

            DBElement <int, string> elem1 = new DBElement <int, string>("Element-1", "Description of Element-1");

            elem1.payload = "Payload of element-1.";
            elem1.children.AddRange(new List <int> {
                9, 10, 11, 79
            });
            DBElement <int, string> elem2 = new DBElement <int, string>("Element-2", "Description of Element-2");

            elem2.payload = "Payload of element-2.";
            DBElement <int, string> elem3 = new DBElement <int, string>("Element-3", "Description of Element-3");

            elem3.payload = "Payload of element-3.";

            DBEngine <int, DBElement <int, string> > db = new DBEngine <int, DBElement <int, string> >();

            db.insert(1, elem1);
            db.insert(2, elem2);
            db.insert(3, elem3);
            db.showDB();

            DBElement <int, string> result_elem  = new DBElement <int, string>();
            DBElement <int, string> result_elem2 = new DBElement <int, string>();

            //DBElement<int, string> result_elem = new DBElement<int, string>();
            Write("\n\n  Send query -> Find element with key = 2");

            result_elem = sendQuery.findValue <int, DBElement <int, string>, string>(db, 2);
            if (result_elem == null)
            {
                WriteLine("\n  Element with Key= 2 was not found in the database.");
            }
            else
            {
                result_elem.showElement();
            }

            Write("\n\n  Send query -> Find element with key = 5");
            result_elem = sendQuery.findValue <int, DBElement <int, string>, string>(db, 5);
            if (result_elem == null)
            {
                WriteLine("\n  Element with Key= 5 was not found in the database.");
            }
            else
            {
                result_elem.showElement();
            }

            Write("\n  Send query -> Get children of element with key = 1");
            List <int> x1 = sendQuery.getChildren <int, DBElement <int, string>, string>(db, 1);

            Write("\n  Children of element with key=1 are ");
            foreach (int i in x1)
            {
                Write("{0} ", i);
            }

            Write("\n\n  Send query -> Get children of element with key = 3");
            List <int> y1 = sendQuery.getChildren <int, DBElement <int, string>, string>(db, 3);

            if (y1.Count() > 0)
            {
                Write("\n  Children of element with key=3 are ");
                foreach (int i in y1)
                {
                    Write("{0} ", i);
                }
            }
            else
            {
                WriteLine("\n  Element with key=3 has no children.");
            }

            WriteLine("\n  Send query -> Get keys with string -\"blah\" in metadata section.");
            List <int> m1 = sendQuery.get_keys_with_metadata <int, DBElement <int, string>, string>(db, "18779");

            if (m1.Count() > 0)
            {
                Write("  Keys that contain the string \"ent-2\" in their metadata section are: ");
                foreach (int i in m1)
                {
                    Write("{0} ", i);
                }
            }
            else
            {
                WriteLine("  No keys found having \"ent-2\" in their metadata section.");
            }

            //WriteLine("Type of x = {0}", x.ToString());



            //----< Test query methods for DBEngine<string, DBElement<string, List<string>>>  >----------
            Write("\n\n --- Test Query methods for DBEngine<string, DBElement<string,List<string>>> ---");
            DBElement <string, List <string> > new_elem1 = new DBElement <string, List <string> >("Element-One", "Description of Element-One");

            new_elem1.payload = new List <string> {
                "First string in payload of Element-One", "Second string in payload of Element-One", "Third string"
            };
            new_elem1.children.AddRange(new List <string> {
                "Nine", "Ten", "Eleven"
            });
            System.Threading.Thread.Sleep(1200);
            DateTime tm1 = DateTime.Now;

            System.Threading.Thread.Sleep(1200);
            DBElement <string, List <string> > new_elem2 = new DBElement <string, List <string> >("Element-Two", "Description of Element-Two");

            new_elem2.payload = new List <string> {
                "First string in payload of Element-Two", "Mars", "Venus"
            };
            System.Threading.Thread.Sleep(1200);
            DBElement <string, List <string> > new_elem3 = new DBElement <string, List <string> >("Element-Three", "Description of Element-Three");

            new_elem3.payload = new List <string> {
                "First string in payload of element-3", "Beta", "Gamma"
            };

            DBEngine <string, DBElement <string, List <string> > > new_db = new DBEngine <string, DBElement <string, List <string> > >();

            new_db.insert("One", new_elem1);
            new_db.insert("Two", new_elem2);
            new_db.insert("Three", new_elem3);

            DateTime tm2 = DateTime.Now;

            new_db.showEnumerableDB();

            Write("\n\n  Send query -> Find element with key = One");
            if (sendQuery.findValue <string, DBElement <string, List <string> >, List <string> >(new_db, "One") == null)
            {
                WriteLine("\n  Element with Key= \"One\" was not found in the database.");
            }
            else
            {
                sendQuery.findValue <string, DBElement <string, List <string> >, List <string> >(new_db, "One").showEnumerableElement();
            }

            Write("\n\n  Send query -> Find element with key = Five");
            if (sendQuery.findValue <string, DBElement <string, List <string> >, List <string> >(new_db, "Five") == null)
            {
                WriteLine("\n  Element with Key= \"Five\" was not found in the database.");
            }
            else
            {
                sendQuery.findValue <string, DBElement <string, List <string> >, List <string> >(new_db, "Five").showEnumerableElement();
            }

            Write("\n  Send query -> Get children of element with key = \"One\"");
            //List<int> x = sendQuery.getChildren<int, DBElement<int, string>, string>(db, 1);
            List <string> x = sendQuery.getChildren <string, DBElement <string, List <string> >, List <string> >(new_db, "One");

            if (x.Count() > 0)
            {
                Write("\n  Children of element with key=\"One\" are ");
                foreach (string i in x)
                {
                    Write("{0} ", i);
                }
            }
            else
            {
                WriteLine("\n  Element with key=\"One\"  has no children.");
            }


            Write("\n\n  Send query -> Get children list of element with key = \"Three\"");
            //List<int> x = sendQuery.getChildren<int, DBElement<int, string>, string>(db, 1);
            List <string> y = sendQuery.getChildren <string, DBElement <string, List <string> >, List <string> >(new_db, "Three");

            if (y.Count > 0)
            {
                Write("\n  Children of element with key=\"Three\" are ");
                foreach (string i in y)
                {
                    Write("{0} ", i);
                }
            }
            else
            {
                WriteLine("\n  Element with key=\"Three\"  has no children.");
            }

            List <string> search_pat = new List <string> {
                "UnKnown", "lement"
            };

            foreach (string pattern_in_metadata in search_pat)
            {
                WriteLine("\n  Send query -> Get all keys containing string - \"{0}\" in their metadata section.", pattern_in_metadata);
                List <string> res1 = sendQuery.get_keys_with_metadata <string, DBElement <string, List <string> >, List <string> >(new_db, pattern_in_metadata);
                if (res1.Count > 0)
                {
                    Write("  Keys containing string \"{0}\" in their metadata section are: ", pattern_in_metadata);
                    foreach (string i in res1)
                    {
                        Write("{0} ", i);
                    }
                }
                else
                {
                    WriteLine("  No keys found containing pattern \"{0}\" in their metadata section.", pattern_in_metadata);
                }
            }

            WriteLine("\n\n  Send query -> Get all keys written within time intervals \"{0}\" and \"{1}\"", tm1, tm2);
            List <string> result1 = sendQuery.get_keys_within_timeInterval <string, DBElement <string, List <string> >, List <string> >(new_db, tm1);

            if (result1.Count > 0)
            {
                Write("  Keys written within specified time intervals are: ");
                //Write("  Keys are: ");
                foreach (string i in result1)
                {
                    Write("{0} ", i);
                }
            }
            else
            {
                WriteLine("  No keys found written withing specified time interevals tm1 and tm2.");
            }
            //WriteLine("tm1 = {0}\ntm2 = {1}", tm1, tm2);
        }