示例#1
0
        private static ProbRelation getRelationBySelectAttributeV2(ProbRelation probRelation, List <ProbAttribute> attributes)
        {
            ProbRelation relation = new ProbRelation();

            relation.RelationName = probRelation.RelationName;

            List <int> indexs      = new List <int>();
            List <int> indexRemove = new List <int>();

            for (int i = 0; i < probRelation.Scheme.Attributes.Count; i++)
            {
                if (attributes.Any(x => x.AttributeName.Trim().ToLower().Contains(probRelation.Scheme.Attributes[i].AttributeName.Trim().ToLower())))
                {
                    indexs.Add(i);
                }
            }

            foreach (ProbTuple item in probRelation.tuples)
            {
                ProbTuple tuple = new ProbTuple();
                for (int i = 0; i < indexs.Count; i++)
                {
                    tuple.Triples.Add(item.Triples[indexs[i]]);
                }
                relation.tuples.Add(tuple);
            }

            relation.Scheme.Attributes = attributes;

            return(relation);
        }
示例#2
0
        public SelectCondition(ProbRelation probRelation, string conditionString)
        {
            // TODO: Complete member initialization
            relations = probRelation;

            int i = 0;

            while (i < conditionString.Length - 1)
            {
                if (conditionString[i] == '<' && conditionString[i + 1] != '=')
                {
                    conditionString = conditionString.Insert(i++, "_");
                }
                if (conditionString[i] == '>' && conditionString[i + 1] != '=')
                {
                    conditionString = conditionString.Insert(i++, "_");
                }
                if (conditionString[i] == '=' && conditionString[i - 1] != '!' && conditionString[i - 1] != '<' && conditionString[i - 1] != '>')
                {
                    conditionString = conditionString.Insert(i++, "_");
                }
                i++;
            }
            this.conditionString = conditionString.Trim();
            this.Attributes      = probRelation.Scheme.Attributes;
            this.MessageError    = string.Empty;
        }
示例#3
0
        private ProbRelation NaturalJoin(ProbRelation relationResult, ProbRelation relationInput, string operationRa)
        {
            ProbRelation relation     = Descartes(relationResult, relationInput);
            List <int>   indexsRemove = new List <int>();

            var totalAttributesOne = relation.Scheme.Attributes.Count - relationInput.Scheme.Attributes.Count;

            for (int i = 0; i < totalAttributesOne; i++)
            {
                for (int j = totalAttributesOne; j < relation.Scheme.Attributes.Count; j++)
                {
                    if (i != j && relation.Scheme.Attributes[i].Type.DataType == relation.Scheme.Attributes[j].Type.DataType)
                    {
                        string attributeOne = relation.Scheme.Attributes[i].AttributeName.Substring(relation.Scheme.Attributes[i].AttributeName.IndexOf(".") + 1);
                        string attributeTwo = relation.Scheme.Attributes[j].AttributeName.Substring(relation.Scheme.Attributes[j].AttributeName.IndexOf(".") + 1);

                        if (attributeOne.Equals(attributeTwo, StringComparison.CurrentCultureIgnoreCase))
                        {
                            indexsRemove.Add(j);

                            for (int k = relation.tuples.Count - 1; k >= 0; k--)
                            {
                                ProbTriple triple = JoinTwoTriple(relation.tuples[k].Triples[i], relation.tuples[k].Triples[j], relation.Scheme.Attributes[i], operationRa);
                                if (triple != null)
                                {
                                    relation.tuples[k].Triples[i] = triple;
                                    relation.tuples[k].Triples[j] = triple;
                                }
                                else
                                {
                                    relation.tuples.RemoveAt(k);
                                }
                            }
                        }
                    }
                }
            }

            var check = relation.Scheme.Attributes.Count() == this.selectedAttributes.Count();

            if (check)
            {
                for (int i = 0; i < indexsRemove.Count; i++)
                {
                    foreach (ProbTuple tuple in relation.tuples)
                    {
                        tuple.Triples.RemoveAt(indexsRemove[i]);
                    }
                    relation.Scheme.Attributes.RemoveAt(indexsRemove[i]);
                    this.selectedAttributes.RemoveAt(indexsRemove[i]);
                }
            }

            //OperationNaturalJoin = string.Empty;
            flagNaturalJoin = false;
            return(relation);
        }
示例#4
0
        private ProbRelation Descartes(ProbRelation relationOne, ProbRelation relationTwo)
        {
            ProbRelation relation = new ProbRelation();

            GenerateNewRelation(relation, relationOne);
            GenerateNewRelation(relation, relationTwo);

            JoinTwoRelation(relation, relationOne, relationTwo);

            return(relation);
        }
示例#5
0
        private ProbRelation NaturalJoin()
        {
            ProbRelation relation     = Descartes();
            List <int>   indexsRemove = new List <int>();

            for (int i = 0; i < relation.Scheme.Attributes.Count - this.selectedRelations[1].Scheme.Attributes.Count; i++)
            {
                for (int j = this.selectedRelations[1].Scheme.Attributes.Count; j < relation.Scheme.Attributes.Count; j++)
                {
                    if (i != j && relation.Scheme.Attributes[i].Type.DataType == relation.Scheme.Attributes[j].Type.DataType) //cung kieu du lien
                    {
                        string attributeOne = relation.Scheme.Attributes[i].AttributeName.Substring(relation.Scheme.Attributes[i].AttributeName.IndexOf(".") + 1);
                        string attributeTwo = relation.Scheme.Attributes[j].AttributeName.Substring(relation.Scheme.Attributes[j].AttributeName.IndexOf(".") + 1);

                        if (attributeOne.Equals(attributeTwo, StringComparison.CurrentCultureIgnoreCase)) //cung ten attr (!= bang)
                        {
                            indexsRemove.Add(j);                                                          //j danh dau truong chung de bo ra

                            for (int k = relation.tuples.Count - 1; k >= 0; k--)
                            {
                                ProbTriple triple = JoinTwoTriple(relation.tuples[k].Triples[i], relation.tuples[k].Triples[j], relation.Scheme.Attributes[i], this.OperationNaturalJoin);
                                if (triple != null)
                                {
                                    relation.tuples[k].Triples[i] = triple;
                                    relation.tuples[k].Triples[j] = triple;
                                }
                                else
                                {
                                    //value is not equal
                                    relation.tuples.RemoveAt(k);
                                }
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < indexsRemove.Count; i++)
            {
                foreach (ProbTuple tuple in relation.tuples)
                {
                    tuple.Triples.RemoveAt(indexsRemove[i]);
                }
                relation.Scheme.Attributes.RemoveAt(indexsRemove[i]);
                this.selectedAttributes.RemoveAt(indexsRemove[i]);
            }



            OperationNaturalJoin = string.Empty;
            flagNaturalJoin      = false;
            return(relation);
        }
示例#6
0
 private void GenerateNewRelation(ProbRelation relation, ProbRelation relationInput)
 {
     relation.ListRenameRelation.Add(relationInput.RelationName);
     foreach (ProbAttribute attr in relationInput.Scheme.Attributes)
     {
         if (attr.AttributeName.IndexOf(".") == -1)
         {
             attr.AttributeName = relationInput.RelationName + "." + attr.AttributeName;
         }
     }
     relation.Scheme.Attributes.AddRange(relationInput.Scheme.Attributes);
 }
示例#7
0
 private static void JoinTwoRelation(ProbRelation relation, ProbRelation relation1, ProbRelation relation2)
 {
     foreach (ProbTuple tupleOne in relation1.tuples)
     {
         foreach (ProbTuple tupleTwo in relation2.tuples)
         {
             ProbTuple value = new ProbTuple();
             value.Triples.AddRange(tupleOne.Triples);
             value.Triples.AddRange(tupleTwo.Triples);
             relation.tuples.Add(value);
         }
     }
 }
示例#8
0
        private ProbRelation Descartes()
        {
            ProbRelation relation = new ProbRelation();


            relation.ListRenameRelation.Add(this.selectedRelations[0].RelationName);
            foreach (ProbAttribute attr in this.selectedRelations[0].Scheme.Attributes)
            {
                if (attr.AttributeName.IndexOf(".") == -1)
                {
                    attr.AttributeName = this.selectedRelations[0].RelationName + "." + attr.AttributeName;
                }
            }
            relation.Scheme.Attributes.AddRange(this.selectedRelations[0].Scheme.Attributes);


            relation.ListRenameRelation.Add(this.selectedRelations[1].RelationName);
            foreach (ProbAttribute attr in this.selectedRelations[1].Scheme.Attributes)
            {
                if (attr.AttributeName.IndexOf(".") == -1)
                {
                    attr.AttributeName = this.selectedRelations[1].RelationName + "." + attr.AttributeName;
                }
            }

            relation.Scheme.Attributes.AddRange(this.selectedRelations[1].Scheme.Attributes);


            foreach (ProbTuple tupleOne in this.selectedRelations[0].tuples)
            {
                foreach (ProbTuple tupleTwo in this.selectedRelations[1].tuples)
                {
                    ProbTuple value = new ProbTuple();
                    value.Triples.AddRange(tupleOne.Triples);
                    value.Triples.AddRange(tupleTwo.Triples);
                    relation.tuples.Add(value);
                }
            }

            return(relation);
        }
示例#9
0
        private List <ProbRelation> GetAllRelation(string valueString)
        {
            int           posOne;
            int           posTwo;
            string        relationsString    = string.Empty;
            List <string> listOfRelationName = this.probDatabase.ListOfRelationNameToLower();

            string[]            seperator = { "," };
            string[]            relations;
            List <ProbRelation> probRelations = new List <ProbRelation>();


            //////////////////////// Get Relations ///////////////////////
            posOne = valueString.IndexOf("from") + 4;

            if (!valueString.Contains("where"))
            {
                posTwo = valueString.Length - 1;
            }
            else
            {
                posTwo = valueString.IndexOf("where") - 1;
            }

            relationsString = valueString.Substring(posOne, posTwo - posOne + 1);  // Get Relation in the Query Text



            if (relationsString.Trim().Length <= 0)
            {
                MessageError = "No relation exists in the query !";
                return(null);
            }


            if (relationsString.Contains(","))
            {
                relations = relationsString.Split(seperator, StringSplitOptions.RemoveEmptyEntries);
            }
            else
            if (relationsString.Contains(" natural join in") || relationsString.Contains(" natural join ig") || relationsString.Contains(" natural join me"))
            {
                relations = new string[2];

                if (relationsString.Contains(" natural join in"))
                {
                    relations[0]         = relationsString.Substring(0, relationsString.IndexOf("natural join in")).Trim();
                    relations[1]         = relationsString.Substring(relationsString.IndexOf("natural join in") + 15).Trim();
                    OperationNaturalJoin = "in";
                }
                else
                if (relationsString.Contains(" natural join ig"))
                {
                    relations[0]         = relationsString.Substring(0, relationsString.IndexOf("natural join ig")).Trim();
                    relations[1]         = relationsString.Substring(relationsString.IndexOf("natural join ig") + 15).Trim();
                    OperationNaturalJoin = "ig";
                    OperationNaturalJoin = "ig";
                }
                else
                {
                    relations[0]         = relationsString.Substring(0, relationsString.IndexOf("natural join me")).Trim();
                    relations[1]         = relationsString.Substring(relationsString.IndexOf("natural join me") + 15).Trim();
                    OperationNaturalJoin = "me";
                }

                foreach (string item in relations)
                {
                    if (item == "")
                    {
                        MessageError = "Incorrect syntax near 'from'.";
                        return(null);
                    }
                    string[] listTmp = item.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    if (listTmp.Length != 1)
                    {
                        MessageError = "Incorrect syntax near 'from'.";
                        return(null);
                    }
                }
                flagNaturalJoin = true;
            }
            else
            {
                relations    = new string[1];
                relations[0] = relationsString;
            }



            if (relations.Length > 2)
            {
                MessageError = "The query only accept one or two relation.";
                return(null);
            }


            if (relations.Length == 1)
            {
                string[] listTmp = relations[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                if (listTmp.Length > 2)
                {
                    MessageError = "Incorrect syntax near 'from'.";
                    return(null);
                }

                if (!listOfRelationName.Contains(listTmp[0].ToLower()))
                {
                    MessageError = String.Format("Invalid relation name '{0}'.", listTmp[0]);
                    return(null);
                }
            }
            else
            {
                for (int i = 0; i < relations.Length; i++)
                {
                    string[] listTmp = relations[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    if (listTmp.Length > 2)
                    {
                        MessageError = "Incorrect syntax near 'from'.";
                        return(null);
                    }

                    if (!listOfRelationName.Contains(listTmp[0].ToLower()))
                    {
                        MessageError = String.Format("Invalid relation name '{0}'.", listTmp[0]);
                        return(null);
                    }
                }
            }


            for (int i = 0; i < relations.Length; i++)
            {
                string[]     listTmp = relations[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                ProbRelation tmp     = this.probDatabase.Relations.SingleOrDefault(c => c.RelationName.ToLower().Equals(listTmp[0], StringComparison.OrdinalIgnoreCase));


                ProbRelation rela = new ProbRelation();
                if (listTmp.Length == 2)
                {
                    rela.RelationName = listTmp[1];
                }
                else
                {
                    rela.RelationName = tmp.RelationName;
                }

                rela.Scheme = new ProbScheme(-1, tmp.Scheme.SchemeName, tmp.Scheme.Attributes);

                foreach (ProbTuple item in tmp.tuples)
                {
                    ProbTuple tuple = new ProbTuple(item);
                    rela.tuples.Add(tuple);
                }


                probRelations.Add(rela);
            }


            if (probRelations.Count == 2)
            {
                if (probRelations[0].RelationName == probRelations[1].RelationName)
                {
                    MessageError = String.Format("The correlation name '{0}' is specified multiple times in a FROM clause.", probRelations[0].RenameRelationName);
                    return(null);
                }
            }

            foreach (ProbRelation item in probRelations)
            {
                if (item.RelationName != string.Empty)
                {
                    try
                    {
                        int value = Convert.ToInt32(item.RelationName);
                        MessageError = String.Format("Incorrect syntax near '{0}'.", item.RelationName);
                        return(null);
                    }
                    catch (Exception)
                    {
                    }
                }
            }

            return(probRelations);
        }
示例#10
0
        private List <ProbAttribute> GetAttribute(string valueString)
        {
            List <ProbAttribute> listProbAttribute = new List <ProbAttribute>();
            //////////////////////// Get Attributes //////////////////////
            int posOne, posTwo;


            // * là chọn tất cả các thuộc tính
            if (valueString.Contains("*"))
            {
                posOne = valueString.IndexOf("*");                                                  // start postion of attributes
                posTwo = valueString.IndexOf("from ") - 1;

                if (posOne > posTwo)
                {
                    MessageError = "Incorrect syntax near 'from'.";
                    return(null);
                }


                if (posOne < valueString.IndexOf("select"))
                {
                    MessageError = "Incorrect syntax near 'select'.";
                    return(null);
                }

                if (valueString.Contains("where") && posOne > valueString.IndexOf("where"))
                {
                    MessageError = "Incorrect syntax near 'where'.";
                    return(null);
                }

                if (posOne != valueString.LastIndexOf("*"))
                {
                    MessageError = "Incorrect syntax near 'select'.";
                    return(null);
                }

                // end postion of attributes
                string attributes = valueString.Substring(posOne, posTwo - posOne + 1);

                // Nếu như phia sau dấu * có bất kì kí tự nào thì sẽ thông báo lỗi
                if (attributes.Trim().Length > 1)
                {
                    MessageError = "Incorrect syntax near 'select'.";
                    return(null);
                }

                // thực hiện sao chép toàn bộ thuộc tính của các quan hệ vào danh sách thuộc tính chọn
                for (int i = 0; i < this.selectedRelations.Count; i++)
                {
                    foreach (ProbAttribute attr in this.selectedRelations[i].Scheme.Attributes)
                    {
                        attr.AttributeName = String.Format("{0}.{1}", this.selectedRelations[i].RelationName, attr.AttributeName);
                        listProbAttribute.Add(attr);
                    }
                }

                return(listProbAttribute);
            }
            else // ngược lại là xuất theo thuộc tính chỉ định
            {
                posOne = valueString.IndexOf("select") + 6;                                                  // start postion of attributes
                posTwo = valueString.IndexOf("from ") - 1;                                                   // end postion of attributes


                string attributes = valueString.Substring(posOne, posTwo - posOne + 1);

                //kiểm tra cú pháp của chuổi thuộc tính
                if (!QueryExecution.CheckStringAttribute(attributes))
                {
                    MessageError = "Incorrect syntax near 'select'.";
                    return(null);
                }
                else
                {
                    string[] seperator = { "," };
                    string[] attribute = attributes.Split(seperator, StringSplitOptions.RemoveEmptyEntries); // split thành mảng các thuộc tính

                    foreach (string str in attribute)
                    {
                        if (!str.Contains("."))
                        {
                            string attributeName      = str.Trim();
                            int    countOne           = 0;
                            int    countSameAttribute = 0;
                            foreach (ProbRelation relation in this.selectedRelations)
                            {
                                List <string> listOfAttributeName = relation.Scheme.ListOfAttributeNameToLower();
                                if (listOfAttributeName.Contains(attributeName.ToLower()))
                                {
                                    ProbAttribute attr = new ProbAttribute(relation.Scheme.Attributes[listOfAttributeName.IndexOf(attributeName)]);
                                    attr.AttributeName = String.Format("{0}.{1}", relation.RelationName, attr.AttributeName);
                                    listProbAttribute.Add(attr);
                                    countSameAttribute++;
                                }
                                else
                                {
                                    countOne++;
                                }
                            }

                            if (countOne == this.selectedRelations.Count)
                            {
                                MessageError = String.Format(" Invalid attribute name '{0}'.", attributeName);
                                return(null);
                            }

                            if (countSameAttribute == this.selectedRelations.Count && this.selectedRelations.Count >= 2)
                            {
                                MessageError = String.Format(" Ambiguous attribute name '{0}'.", attributeName);
                                return(null);
                            }
                        }
                        else
                        {
                            string[] array = str.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                            if (array.Length != 2)
                            {
                                MessageError = "Incorrect syntax near the keyword 'select'.";
                                return(null);
                            }

                            ProbRelation relation = this.selectedRelations.SingleOrDefault(c => c.RelationName.Trim() == array[0].Trim());

                            if (relation == null)
                            {
                                MessageError = String.Format("The multi-part identifier '{0}' could not be bound.", str);
                                return(null);
                            }

                            ProbAttribute attr = new ProbAttribute(relation.Scheme.Attributes.SingleOrDefault(c => c.AttributeName.Trim().ToLower() == array[1].Trim()));
                            attr.AttributeName = String.Format("{0}.{1}", relation.RelationName, attr.AttributeName);

                            if (attr == null)
                            {
                                MessageError = "Invalid attribute name '" + array[1] + "'.";
                                return(null);
                            }


                            listProbAttribute.Add(attr);
                        }
                    }

                    return(listProbAttribute);
                }
            }
        }
示例#11
0
        private List <ProbRelation> GetAllRelation(string valueString)
        {
            int           posOne;
            int           posTwo;
            string        relationsString    = string.Empty;
            List <string> listOfRelationName = this.probDatabase.ListOfRelationNameToLower();

            string[]            seperator = { "," };
            string[]            relations;
            List <ProbRelation> probRelations = new List <ProbRelation>();

            //////////////////////// Get Relations ///////////////////////
            posOne = valueString.IndexOf(Common.From) + 4;

            if (!valueString.Contains(Common.Where))
            {
                posTwo = valueString.Length - 1;
            }
            else
            {
                posTwo = valueString.IndexOf(Common.Where) - 1;
            }

            relationsString = valueString.Substring(posOne, posTwo - posOne + 1);   // Get Relation in the Query Text

            if (relationsString.Trim().Length <= 0)
            {
                MessageError = "No relation exists in the query !";
                return(null);
            }

            if (relationsString.Contains(","))
            {
                relations = relationsString.Split(seperator, StringSplitOptions.RemoveEmptyEntries);
            }
            else
            {
                if (relationsString.Contains(Common.NaturalJoinIn) || relationsString.Contains(Common.NaturalJoinIg) || relationsString.Contains(Common.NaturalJoinMe))
                {
                    var listRaltion = relationsString.Split(new string[] { "natural join" }, StringSplitOptions.RemoveEmptyEntries);

                    relations = new string[listRaltion.Length];

                    for (int i = 0; i < listRaltion.Length; i++)
                    {
                        if (i == 0)
                        {
                            relations[i] = listRaltion[i];
                        }
                        else
                        {
                            string[] listTmp = listRaltion[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            if (listTmp.Length != 2 && listTmp.Length != 3)
                            {
                                MessageError = String.Format("Incorrect syntax near '{0}'.", listRaltion[i]);
                                return(null);
                            }
                            if (!listTmp[0].Contains("in") && !listTmp[0].Contains("ig") && !listTmp[0].Contains("me"))
                            {
                                MessageError = String.Format("Incorrect syntax near '{0}'.", listRaltion[i]);
                                return(null);
                            }

                            OperationNaturalJoin.Add(listTmp[0]);
                            if (listTmp.Length == 2)
                            {
                                relations[i] = listTmp[1];
                            }
                            else
                            {
                                relations[i] = listTmp[1] + " " + listTmp[2];
                            }
                        }
                    }

                    flagNaturalJoin = true;
                }
                else
                {
                    relations    = new string[1];
                    relations[0] = relationsString;
                }
            }

            for (int i = 0; i < relations.Length; i++)
            {
                string[] listTmp = relations[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                if (!listOfRelationName.Contains(listTmp[0].ToLower()))
                {
                    MessageError = String.Format("Invalid relation name '{0}'.", listTmp[0]);
                    return(null);
                }

                if (listTmp.Length > 2)
                {
                    MessageError = String.Format("Invalid relation name '{0}'.", relations[i]);
                    return(null);
                }

                ProbRelation tmp = this.probDatabase.Relations.SingleOrDefault(c => c.RelationName.ToLower().Equals(listTmp[0], StringComparison.OrdinalIgnoreCase));

                ProbRelation rela = new ProbRelation();
                if (listTmp.Length == 2)
                {
                    rela.RelationName = listTmp[1];
                }
                else
                {
                    rela.RelationName = tmp.RelationName;
                }

                rela.Scheme = new ProbScheme(-1, tmp.Scheme.SchemeName, tmp.Scheme.Attributes);

                foreach (ProbTuple item in tmp.tuples)
                {
                    ProbTuple tuple = new ProbTuple(item);
                    rela.tuples.Add(tuple);
                }

                probRelations.Add(rela);
            }

            return(probRelations);
        }