Пример #1
0
        /// <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));
            }
        }
Пример #2
0
        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));
            }
        }