/// <summary> /// Metodo ricorsivo dicotomico. /// Dati i due estremi, mi posiziono in mezzo e ricavo il numero minimo e massimo di fotogramma in quella pagina. /// Poi mi sposto nella metà di sinistra o di destra in base al risultato. /// Continuo a cercare di metà in metà fino a che non trovo il fotogramma desiderato. /// </summary> /// <param name="limiteInf"></param> /// <param name="limiteSup"></param> /// <param name="param"></param> /// <param name="numDaRic"></param> /// <returns>il numero della pagina in cui ho trovato il fotogramma richiesto</returns> private int cercaPaginaRicorsivo(int limiteInf, int limiteSup) { StringBuilder sql = new StringBuilder(); int middlePage = (limiteInf + limiteSup) / 2; // Se sono fuori dai range ammissibili, significa che il numero di foto da ricecare non è stato trovato if (middlePage < limiteInf || limiteSup < 0) { return(0); } sql.Append("Select min(q.numero) minimo, max(q.numero) massimo"); sql.Append(RicercatoreSrvImpl.SEPAR); sql.Append("from ("); sql.Append(RicercatoreSrvImpl.SEPAR); StringBuilder innerSql = new StringBuilder(); innerSql.Append("select f.numero "); innerSql.Append(RicercatoreSrvImpl.SEPAR); innerSql.Append(" from fotografie f "); innerSql.Append(RicercatoreSrvImpl.SEPAR); // .. clausola where innerSql.Append(where); innerSql.Append(RicercatoreSrvImpl.SEPAR); // .. clausola order-by innerSql.Append(orderBy); int skip = ampiezzaPagina * (middlePage - 1); innerSql.AppendFormat(" LIMIT {0} , {1} ", skip, ampiezzaPagina); innerSql.Append(RicercatoreSrvImpl.SEPAR); sql.Append(innerSql); sql.Append(") q"); var query2 = database.SqlQuery <AppoNumNum>(sql.ToString(), sqlParam.ToArray()); AppoNumNum appo = query2.ToList() [0]; // Vediamo se nella pagina attuale ho trovato il numero di foto che sto cercando if (appo.minimo <= numFotogrammaDaric && appo.massimo >= numFotogrammaDaric) { // Trovato return(middlePage); } else { if (appo.massimo < numFotogrammaDaric) { // salgo limiteInf = (ushort)(middlePage + 1); } else { // Scendo limiteSup = (ushort)(middlePage - 1); } return(cercaPaginaRicorsivo(limiteInf, limiteSup)); } }
private ushort ricercaPaginaDicotomicaIntorno(ushort limiteInf, ushort limiteSup, List <object> sqlParam, ParamCercaFoto param) { StringBuilder sql = new StringBuilder(); ushort middlePage = (ushort)((limiteInf + limiteSup) / 2); if (middlePage < limiteInf || limiteSup < 0) { throw new InvalidOperationException("impossibile"); } sql.Append("Select min(q.numero) minimo, max(q.numero) massimo"); sql.Append(SEPAR); sql.Append("from ("); sql.Append(SEPAR); sql.Append("\tselect f.numero"); sql.Append(SEPAR); sql.Append("\tfrom fotografie f"); sql.Append(SEPAR); sql.Append("\twhere 1=1"); sql.Append(SEPAR); if (sqlParam.Count > 0) { sql.Append("\t\tand f.numero between {0} and {1}"); } sql.Append(SEPAR); sql.Append("\t\tand f.giornata = {2}"); sql.Append(SEPAR); string orderBy = creaQuerySQLOrderBy(param); sql.Append(orderBy); sql.Append("\tLIMIT "); int skip = param.paginazione.take * (middlePage - 1); sql.Append(Convert.ToString(skip)); sql.Append(" , "); sql.Append(param.paginazione.take); sql.Append(SEPAR); sql.Append(") q"); var query = objectContext.Database.SqlQuery <AppoNumNum>(sql.ToString(), sqlParam.ToArray()); AppoNumNum appo = query.ToList()[0]; // Vediamo se nella pagina attuale ho trovato il numero di foto che sto cercando if (appo.minimo <= param.numeroConIntorno && appo.massimo >= param.numeroConIntorno) { // Trovato return(middlePage); } else { if (param.ordinamento == Ordinamento.Asc) { if (appo.massimo < param.numeroConIntorno) { // salgo limiteInf = (ushort)(middlePage + 1); } else { // Scendo limiteSup = (ushort)(middlePage - 1); } } else if (param.ordinamento == Ordinamento.Desc) { if (appo.minimo > param.numeroConIntorno) { // salgo limiteInf = (ushort)(middlePage + 1); } else { // Scendo limiteSup = (ushort)(middlePage - 1); } } return(ricercaPaginaDicotomicaIntorno(limiteInf, limiteSup, sqlParam, param)); } }