private Reach extract(Reach source, bool includeTokens) { Reach ret = source.upto(0) + source.from(source.len + 1); // FromLeftToRight strategy Reach ret = source.from(source.len + 1) for (long i = 1; i <= def.Length; i++) { long k = 1; while ((k <= rpt[i - 1]) || ((rpt[i - 1] == 0) && (source.len > 0))) { Reach leadIn = source.at(1, utl.dmyBool("al(occur, token) is planned"), def[i - 1].Name); if ((leadIn.len == 0) && (def[i - 1].Name.Length > 0)) { return(ret); } if (includeTokens) { if (ret.len == 0) { ret = leadIn; } else { ret = ret + leadIn; } } Reach res = source.after(leadIn); Reach leadOut = null; int occur = 0; // first we try the first closing bracelet, only in case that this will be a non-matching bracelet then wee will try the second, third, fourth etc. closing closing bracelet do { occur++; for (int j = (def[i - 1]).Len; j > 0; j--) { Reach token = res.at(occur, utl.dmyBool("al(occur, token) is planned"), (def[i - 1])[j]); if (token.len > 0) { leadOut = token; } } } while (nested[i - 1] && (res.upto(leadOut).at(-occur, utl.dmyBool("al(occur, token) is planned"), leadIn.text).len > 0)); if (leadOut != null) { res = res.before(leadOut); } if (leadOut == null) { return((ret.len == 0) ? res : ret + res); } if (ret.len == 0) { ret = includeTokens ? source.after(leadIn).upto(leadOut) : source.after(leadIn).before(leadOut); } else { ret = includeTokens ? ret + source.after(leadIn).upto(leadOut) : ret + source.after(leadIn).before(leadOut); } source = source.after(leadOut); k++; } } return(ret); }
internal DbIns(Reach smb) { init(); //TBD Db db = new Db(new ctx().DbDrivers); DbIns ret = null; Zone bktFilter = new Zone(new Pile <string>(), new Pile <string>("", true, "(", ")", "||:0")); Zone strFilter = new Zone(new Pile <string>(), new Pile <string>("", true, "\"", "\"", "||:1")); /* * string insstr = "Grid(\"prdrln\").sC(\"sbj, obj, vb, rul, steps, excerpt, trust\").INS(XXXX)"; * insstr = insstr.Replace("XXXX", "Grid(\"prdrln p1, prdvrb pv1, prdrln p2, prdvrb pv2, kndrln sc, itmrln si, prdvrb pv, prdrul pr, itmrln oi, kndrln oc\", cd(\"p1.obj\").EQ(\"p2.sbj\")).sC(\"si.id, oi.id, pv.id, pr.id, 0, '', 0.5\").sR(XXXX).SLD"); * insstr = insstr.Replace("XXXX", "cd(\"0\").EQ(Grid(\"prdrln prdrln\").sC(\"count(*)\").sR(cd(\"sbj\").EQ(\"si.id\"), cd(\"obj\").EQ(\"oi.id\"), cd(\"vb\").EQ(\"pr.vb\")).SLC ), XXXX"); * insstr = bktFilter.on(insstr).text; * insstr = insstr.Replace("XXXX", "cd(\"0\").EQ(Grid(\"prdrln prdrln\").sC(\"count(*)\").sR(cd(\"sbj\").EQ(\"si.id\"), cd(\"obj\").EQ(\"oi.id\"), cd(\"vb\").EQ(\"pr.vb\")).SLC ), XXXX"); */ Reach gridDef = smb - bktFilter.on(smb); Reach ins = gridDef.at(".INS("); if (ins.len == 0) { throw new Exception("DbIns Constructor: invalid symbolic Definition"); } DbGrid res = db.Grid(smb.before(ins)); smb = smb.after(ins).before(-1, ")"); if (smb.startsWith("Grid(")) { ret = res.INS(new DbSlc(smb)); } else { Pile <string> val = new Pile <string>(); while (smb.len > 0) { if (smb.startsWith("ds(")) { val.Push(db.ds(smb.after(1, "\"").before(1, "\""))); smb = smb.after(1, "),").Trim(); } else { val.Push(smb.before(1, ",").Trim()); smb = smb.after(1, ",").Trim(); } } ret = res.INS(val.array()); } into = ret.into; fields = ret.fields.Clone(); //new Pile<string>(ret.fieldNames); values = ret.values; slc = ret.slc; }
internal DbGrid(Reach smb) { init(); Zone bktFilter = new Zone(new Pile <string>(), new Pile <string>("", true, "(", ")", "||:1")); Zone strFilter = new Zone(new Pile <string>(), new Pile <string>("", true, "\"", "\"", "||:1")); if (smb.at(".OR").len > 0) { smb = smb; } //def = new Reach("Grid(\"cpt cpt\").sC(\"id\").sR(cd(\"idnm\").EQ(ds(\"TS\")).OR(cd(\"idnm\").EQ(ds(\"TO\"))).OR(cd(\"idnm\").EQ(ds(\"TO\")))).SLC"); smb = new Reach(smb.text); Reach gridDef = bktFilter.on(smb); Reach tblDef = strFilter.on(gridDef); addTables(tblDef); Reach jCnd = smb.after(tblDef).after(1, ", "); joinCnd.Add(DbCnd.fromSymbolicDef(jCnd)); string testsql = this.SLC.sql(); smb = smb.after(gridDef).from(3); while (smb.len > 0) { if (smb.startsWith("sR(")) { Reach selCnds = bktFilter.on(smb); joinCnd = sR(DbCnd.fromSymbolicDef(selCnds)).joinCnd; selCnd = sR(DbCnd.fromSymbolicDef(selCnds)).selCnd; smb = smb.after(selCnds).from(3); } else if (smb.startsWith("sC(")) { Reach colDef = strFilter.on(bktFilter.on(smb)); fields = sC(colDef).fields; smb = smb.after(colDef).from(4); } else if (smb.startsWith("SL")) { smb = smb.from(4); } } allFields = fields; //addTables(tables); }
public string struc(long indent) { string ret = new string(' ', Math.Max(0, (int)indent)); if (this != root) { ret += def + ctn.before(1, "<"); } string lastType = ""; foreach (Tag t in _tags) { if ((t.type.len == 0) && ((t.def + t.ctn.before(1, "<")).len > 0)) { ret += t.def + t.ctn.before(1, "<"); } else if (t.type.text.ToLower().Equals("/" + lastType)) { ret += t.def; } else { ret += "\n".Substring(0, Math.Min(1, ret.Length)) + t.struc(indent + 1); } lastType = t.type.text.ToLower(); } if (closingTag != null) { if (closingTag != this) { ret += closingTag.def; } else if (!type.Equals("") && !type.Equals("!") && !type.startsWith("/")) { if (!def.at(-2).equals("/")) { ret += "</" + type + ">"; } } } return(ret); }
/// <summary> sC ("select Columns") is the fields selector clause. (like in SQL Statements)</summary> public DbGrid sC(string allfields) { DbGrid ret = new DbGrid(this); ret.allFields = ret.fields.Clone(); //new Pile<string> (ret.fieldNames); Reach fields = new Reach(allfields + ","); if (!fields.Trim().equals("*,")) { ret.fields = new Pile <DbField>(); Reach tokenMap = fields - bltZone.upon(fields - chrZone.upon(fields)); //AttGeTr: upon is too expensive! while (fields.Trim().len > 0) { Reach token = tokenMap.at(1, ","); ret.fields.Add(new DbField(fields.before(token).Trim().text)); //AttGeTr: no type information is added for each field !!! / ToBeSolved !!! fields = fields.after(token); tokenMap = tokenMap.after(token); } } return(ret); }
public string Exec(string name, string param) { string ret = ""; string debug = ""; Tag debugDef = null; try { debugDef = new Tag(param, true).tags(2, Tag.where ("[type]==debug"))[1]; } catch (Exception ex) { } if (debugDef != null) { debug = debugDef.attr["name"].Value; } KeyPile <string, Tag> paramSet = new KeyPile <string, Tag>(); //Dictionary<string, Tag> paramSet = new Dictionary<string, Tag>(); Pile <Tag> rsDefSet = new Pile <Tag>(); KeyPile <string, Conditions> rsCondSet = new KeyPile <string, Conditions>(); KeyPile <string, Tag> responseSet = new KeyPile <string, Tag>(); //Dictionary<string, Tag> responseSet = new Dictionary<string, Tag>(); KeyPile <string, Tag> results = new KeyPile <string, Tag>(); KeyPile <string, Pile <NamedValue <string, Tag> > > resSet = new KeyPile <string, Pile <NamedValue <string, Tag> > >(); string url = prepare(name, param, paramSet, rsDefSet, rsCondSet, responseSet, results, debug); Pile <NamedValue <string, Tag> > baseSet = new Pile <NamedValue <string, Tag> >(); foreach (Tag t in results[1].Tags) { baseSet.Add(new NamedValue <string, Tag>("base:" + (baseSet.Len + 1), t)); } resSet.Add("base", baseSet); results[1].tags(-1, 1, rsCondSet, resSet); ret += "<tr>\n<td>" + (++execCounter) + "</td></tr>\n"; foreach (NamedValue <string, Tag> nt in resSet[-1]) { ret += "<tr>\n"; if (debug.Length == 0) { foreach (Tag rDef in responseSet) { Reach val; Reach valDef = rDef.attr["value"].Value.text.Replace("<", "<").Replace(">", ">").ToLower(); Reach delim = valDef.at(1, "."); if ((delim.len > 0) && (!valDef.before(delim).Equals(resSet.Keys[-1]))) { NamedValue <string, Tag> baseTag = nt; while (true) { Reach baseName = (Reach)baseTag.Name; int num = Int32.Parse(baseName.after(1, ":")); baseTag = resSet[baseName.before(1, ":")][num]; if (baseName.before(1, ":").Equals(valDef.before(delim))) { val = baseTag.Value.val(valDef.after(delim)); break; } } } else if (delim.len > 0) { val = nt.Value.val(valDef.after(delim)); } else { val = nt.Value.val(valDef); } ret += " <td>" + val.text.Replace("\n", "").Replace("\r", "") + " </td>\n"; } ret += "</tr>\n"; } else { ret += nt.Value.struc(-1) + "</tr>\n"; } } return("<url>" + url + "</url>" + ret); }
private void splitparts() { if (operators == null) { operators = ops.Clone(); foreach (string key in Dtv.Keys) { operators.Push(new Reach(Dtv[key]).before(1, "``")); } } int inx = 1; while (inx <= Len) { Reach rest = null; object lOp = null; object rOp = null; object tOp = null; //if (this[inx].GetType() == typeof(string)) rest = new Reach((string)this[inx]).Trim(); //AttGeTr SEVERE BUGS HERE!! the middle chars of "word" will be detected as Operator "or" ! if (rest == null) { inx++; } else { Reach firstOptorSmb = rest.At(1, false, operators.array()).Trim(); if (firstOptorSmb.At(1, "(").len == 0) { if (operators.Contains((firstOptorSmb + "(").uText)) { if (rest.after(firstOptorSmb).startsWith("(")) { firstOptorSmb = firstOptorSmb + rest.after(firstOptorSmb).upto(1); // both the infix OR and the prefix OR( may be defined as directive } } } String firstOptor = optorForSymbolicOptor(firstOptorSmb.text); if (rest.startsWith(firstOptorSmb)) { } else { } if (firstOptorSmb.len == 0) { Reach fieldVal = new Reach((string)this[inx]).Trim(); this[inx] = new Reach((string)this[inx]); rest = ""; } // this term has no operand, it is a literal like 3 or a Symbol like a DbField Name or a composite field definition else { if (rest.startsWith(firstOptorSmb)) { if (firstOptorSmb.Equals("(")) { this[inx] = new Trm(Zone.bracelet.on(rest).text); optor = ""; rest = rest.after(Zone.bracelet.upon(rest)).Trim(); } else { string newOptor = firstOptorSmb.Trim().text.Replace("(", ""); bool prefix = (firstOptorSmb.at(1, "(").len > 0); if (prefix) { this[inx] = new Trm(Zone.bracelet.on(rest.after(1, optor).Trim()).text); rest = rest.after(Zone.bracelet.upon(rest.after(1, optor))).Trim(); } else { rest = ""; if (optor.Length > 0) { this[1] = new Trm(optor, this[1]); for (int i = 2; i < inx; i++) { ((Trm)this[1]).Push(this[i]); } for (int i = 2; i <= Len - (inx - 2); i++) { this[i] = this[i + (inx - 2)]; } for (int i = 1; i <= (inx - 2); i++) { Del(Len); } inx = 2; } this[inx] = new Trm(rest.after(1, optor).Trim().text); rest = ""; } if ((((Trm)this[inx]).Len == 1 && ((Trm)this[inx]).optor.Length == 0)) { this[inx] = ((Trm)this[inx]).lOpnd; } optor = optorForSymbolicOptor(firstOptorSmb.Trim().text); } } else { if ((Len == 1) && (optor.Length == 0)) { optor = optorForSymbolicOptor(firstOptorSmb.Trim().text); this[inx] = rest.before(firstOptorSmb).Trim(); Push(rest.after(firstOptorSmb).Trim().text); } else { this[inx] = new Trm(optorForSymbolicOptor(firstOptorSmb.Trim().text), new object[] { rest.before(firstOptorSmb).Trim(), rest.after(firstOptorSmb).Trim().text }); } rest = ""; } } if (rest.len > 0) { Push(rest.text); } rest = ""; inx++; } } }