private void aplicarAumento()
        {
            foreach(var key in mapaAtributos.Keys){
                Atributo attr = mapaAtributos[key];
                String attrAumentado="";
                foreach (Atributo hijo in attr.getDependientes()) {
                    if (attrAumentado.Contains(hijo.getValor().value())) continue;
                    if (hijo != attr.getDependientes().First()) {
                        attrAumentado += ","+hijo.getValor();
                    } else {
                        attrAumentado += hijo.getValor();
                    }
                }
                KString llave = new KString(attrAumentado);
                //System.Diagnostics.Debug.WriteLine(attr.getValor() + ">" + attrAumentado + (mapaAtributos.ContainsKey(llave) ? " esta en mapa " : " no esta en mapa"));
                if (mapaAtributos.ContainsKey(llave)) {
                    mapaAtributos[llave].addDeterminante(attr);
                    //System.Diagnostics.Debug.WriteLine("AGREAGDO: " + attr.getValor() + ">" + attrAumentado);
                }

            }
            aplicarReflexividad();
            aplicarTransitividad();
            //determinarLlavesCandidatas();
            //determinarClavePrimaria();
        }
        protected override string GetSQLCondition(string pattern)
        {
            string val = new KString(Value).SqlEscaped.Trim();

            return(pattern + " LIKE '" + Replacer.ReplaceRusLat(val) + "%' OR " + pattern + "Reverse LIKE '" +
                   Env.ReverseString(Replacer.ReplaceRusLat(val)) + "%'");
        }
 public Atributo(String valor)
 {
     this.esAttrMultivaluado = (valor.ToUpper().IndexOf("<M>") != -1);
     this.esAtConjunto = (valor.IndexOf(",") != -1);
     this.valor = new KString(esAttrMultivaluado ? valor.Remove(valor.IndexOf('<')) : valor);
     //System.Diagnostics.Debug.WriteLine(this.valor);
     peso = 1;
     if (esAtConjunto) {
         peso = valor.Split(',').Count();
     }
     this.determina = new List<Atributo>();
     this.depende = new List<Atributo>();
 }
 public Atributo(KString kvalue)
 {
     this.valor = kvalue;
     String val = kvalue.value();
     this.esAttrMultivaluado = (val.ToUpper().IndexOf("<M>") != -1);
     this.esAtConjunto = (val.IndexOf(",") != -1);
     //System.Diagnostics.Debug.WriteLine(this.valor);
     peso = 1;
     if (esAtConjunto) {
         peso = val.Split(',').Count();
     }
     this.determina = new List<Atributo>();
     this.depende = new List<Atributo>();
 }
 public void setValor(KString val)
 {
     this.valor = val;
 }
 private void testKstring()
 {
     KString str1 = new KString("A,B,C,D");
     KString str2 = new KString("C,F,G,W");
     KString str3 = new KString("A,B,P,Q");
     KString str4 = new KString("D,B,A,C");
     //String lalal = "A";
     System.Diagnostics.Debug.WriteLine("A,B,C,D - C,F,G,W = " + (str1 - str2).value() + "\n" + "A,B,C,D + A,B,P,Q = " + (str1 + str3).value() + "\nA,B,C,D == D,B,A,C" +
         (str1 == str4 ? " True": " FALSE")
         );
     System.Diagnostics.Debug.WriteLine(str1 + " equals " + str4 + " =" + (str1.Equals(str4) ? " true" : " false"));
 }
        private void crearConjuntos()
        {
            int cantidadOriginales = mapaAtributos.Count;
            List<KString> unitarios = new List<KString>();
            /*TODOS*/
            String nuevo = "";
            foreach (var key in mapaAtributos.Keys) {
                Atributo attr = mapaAtributos[key];
                if (!attr.esConjunto() && !attr.esMultivaluado()) {
                    nuevo += (nuevo == "") ? attr.getValor().value() : "," + attr.getValor();
                    unitarios.Add(attr.getValor());
                }
            }

            Atributo atributoConj = new Atributo(nuevo);
            if (!mapaAtributos.ContainsKey(atributoConj.getValor())) {
                mapaAtributos.Add(atributoConj.getValor(), atributoConj);
                System.Diagnostics.Debug.WriteLine("Agregado: " + nuevo);
            }

            /*Subconjuntos pequeños*/

            KString TODOS = new KString(nuevo);
            for (int i = 2; i < cantidadOriginales - 1; i++) {
                List<KString> nuevos = combinacion(unitarios, i);
                foreach (KString nuevoCon in nuevos) {
                    if (!mapaAtributos.ContainsKey(nuevoCon)) {
                        mapaAtributos.Add(nuevoCon, new Atributo(nuevoCon));
                    }
                }
            }
            /*
            List<String> nuevos = new List<String>();
            foreach (var atributoAQuitar in mapaAtributos.Keys) {
                nuevo = "";
                foreach (var key in mapaAtributos.Keys) {
                    if (atributoAQuitar == key) continue;
                    Atributo attr = mapaAtributos[key];
                    if (!attr.esConjunto() && !attr.esMultivaluado()) {
                        nuevo += (nuevo == "") ? attr.getValor().value() : "," + attr.getValor();
                    }
                }
                nuevos.Add(nuevo);
            }

            foreach (String val in nuevos) {
                Atributo atributoSubConj = new Atributo(val);
                if (!mapaAtributos.ContainsKey(atributoSubConj.getValor())) {
                    mapaAtributos.Add(atributoSubConj.getValor(), atributoSubConj);
                    System.Diagnostics.Debug.WriteLine("Agregado: " + val);
                }
            }*/
        }
        private List<KString> combinacion(List<KString> lista, int orden)
        {
            if (orden == 1) return lista;
            List<KString> listaSalida = new List<KString>();

            List<KString> nodosComb = new List<KString>();
            String nuevo = "";
            foreach (KString nodo in lista) {
                nodosComb.Add(nodo);

                for (int j = 0; j < lista.Count - 1; j++) {
                    nuevo = nodo.value();
                    for (int i = 0; i < orden-1; i++) {
                        KString nod = getNodoACombinar(lista, nodosComb);
                        if ((Object)nod == null) break;
                        nodosComb.Add(nod);
                        nuevo += "," + nod.value();
                    }
                    if (!(nuevo.IndexOf(',') == -1)) {
                        KString nuevoValor = new KString(nuevo);
                        if (!listaSalida.Contains(nuevoValor))
                            listaSalida.Add(nuevoValor);
                    }
                }
                nodosComb.Clear();

            }
            return listaSalida;
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            String entrada = tf_entrada.Text.ToUpper();
            switch (cb_tipo.SelectedIndex) {
                //Agregar Relacion
                case 0: {
                    if (relacionValida(entrada)) {
                        listaRelaciones.Items.Add(entrada);
                        String[] elementos = entrada.Split(',');
                        confPB(elementos.Length);
                        foreach (String elem in elementos) {
                            Atributo attr = new Atributo(elem);
                            mapaAtributos.Add(attr.getValor(), attr);
                            barra_progreso.PerformStep();
                        }
                        crearConjuntos();
                        barra_progreso.Value = 0;
                        cb_tipo.SelectedIndex = 1;
                        tf_entrada.Text = "";
                        etiqueta_estado.Text = "Esperando Dependencia...";
                    } else {
                        MessageBox.Show("Datos invalidos, porfavor revise: "+entrada+"\nFormato válido: X,Y<m>,Z,W<m>");
                    }
                        break;
                    }
                //Agregar Dependencia
                case 1: {
                        if (dependenciaValida(entrada)) {
                            String[] deps = entrada.Split('/');
                            foreach (String entradaD in deps) {
                                listaDependencias.Items.Add(entradaD);
                                String[] partes = entradaD.Split('>');
                                KString determinantes = new KString(partes[0]);
                                KString dependientes = new KString(partes[1]);

                                Atributo attrDeterminate;
                                Atributo attrDependiente;
                                if (mapaAtributos.ContainsKey(determinantes)) {
                                    attrDeterminate = mapaAtributos[determinantes];
                                } else {
                                    attrDeterminate = new Atributo(determinantes);
                                    mapaAtributos.Add(determinantes, attrDeterminate);
                                }
                                if (mapaAtributos.ContainsKey(dependientes)) {
                                    attrDependiente = mapaAtributos[dependientes];
                                } else {
                                    attrDependiente = new Atributo(dependientes);
                                    mapaAtributos.Add(dependientes, attrDependiente);
                                }
                                /*al agregar un determinante a un atributo internamente
                                 se agrega al atributo como dependiente.
                                 */
                                attrDependiente.addDeterminante(attrDeterminate);
                            }
                            tf_entrada.Text = "";
                            etiqueta_estado.Text = "Listo";
                            btn_ejecutar.Enabled = true;
                        } else {
                            MessageBox.Show("Datos invalidos, porfavor revise: " + entrada + "\nFormato válido: X,Y>W,Z[/Q,P>R,S]");
                        }
                        break;
                    }
            }//FIn Switch
        }