Este hilo de StackOverflow explica con mucho detalle de donde proceden las funciones lambda y sus diferencias con Closures. Lo hace de forma agnostica a cualquier lenguaje.
No es la respuesta con más puntos positivos, sino la respuesta que habla sobre Lambda Calculus invented by Alonzo Church.
what-is-the-difference-between-a-closure-and-a-lambda
Intentando arrojar un poco de luz a problemas que puedes encontrarte. Especialmente con PostgreSql
martes, 26 de junio de 2018
martes, 29 de mayo de 2018
SQL vs Java 8 Stream
Para entender los streams de Java 8 lo mejor es compararlos con sus equivalentes de SQL.
En el siguiente enlace podrás encontrar más ejemplos.
Fuente: https://windoctor7.github.io/API-Stream-Java8.html
| SQL | Equivalente interfaz stream |
|---|---|
| from | stream() |
| select | map() |
| where | filter() (antes de un collecting) |
| order by | sorted() |
| distinct | distinct() |
| having | filter() (después de un collecting) |
| join | flatMap() |
| union | concat().distinct() |
| offset | skip() |
| limit | limit() |
| group by | collect(groupingBy()) |
| count | count() |
En el siguiente enlace podrás encontrar más ejemplos.
Fuente: https://windoctor7.github.io/API-Stream-Java8.html
lunes, 28 de mayo de 2018
Indices en Postgresql
Hay una serie de índices aparte de los convencionales, que son poco conocidos, pero no por ello dejan de ser muy útiles.
GIN - índices optimizados para la búsqueda de subelementos, dentro de una columna, por ejemplo columnas de tipo Array, columnas que almacenen JSON o campos de texto para hacer búsquedas FTS (Full Text Search).
GIST - índices para búsquedas de datos geolocalizados.
BRIN - índices que ahorra espacio de almacenamiento para aquellos datos que se encuentran ordenados de forma natural. Por ejemplo las entradas de un fichero log, siempre se generan de forma secuencial en base al campo de fecha de la entrada.
HASH - indice optimizado en velocidad para la búsqueda de elementos por igualdad. Por ejemplo la dirección de email de usuarios. Usando este índice tendríamos máxima velocidad de acceso para buscar a un usuario por su email.
GIN - índices optimizados para la búsqueda de subelementos, dentro de una columna, por ejemplo columnas de tipo Array, columnas que almacenen JSON o campos de texto para hacer búsquedas FTS (Full Text Search).
GIST - índices para búsquedas de datos geolocalizados.
BRIN - índices que ahorra espacio de almacenamiento para aquellos datos que se encuentran ordenados de forma natural. Por ejemplo las entradas de un fichero log, siempre se generan de forma secuencial en base al campo de fecha de la entrada.
HASH - indice optimizado en velocidad para la búsqueda de elementos por igualdad. Por ejemplo la dirección de email de usuarios. Usando este índice tendríamos máxima velocidad de acceso para buscar a un usuario por su email.
jueves, 2 de febrero de 2017
Angular UI Bootstrap. Datepicker de un rango de fechas.
Para definir en nuestros formularios de angular unos datepicker muy útiles.
Primero definimos los campos en la página html.
Vamos a crear dos datepicker que definan un rango, no permitiendo que el rango final sea superior al inicial. Además el inicial solo podrá elegirse el primer día de un mes y para el final solo el último día de un mes.
Creamos una fecha para un rango inicial:
Y otra fecha para el final del rango:
Ahora vamos a definir en nuestro ViewModel de Angular las opciones de cada campo:
La variable generalDateOptions, es la configuración común a todos los campos fecha que tengamos en nuestros formularios.
Luego personalizamos algunos de los parámetros de la configuración, como por ejemplo indicamos que para la fecha de inicio, queremos selección por meses no por días (minMode='month') y que queremos que la fecha mínima seleccionamble sea la fecha actual.
A continuación vamos a preparar las funciones de callback (open1 y open2), que serán llamadas cuando se pulse en el icono para abrir el control Datepicker. Aqui vamos a hacer depender la fecha final del rango de la fecha inicial que se haya elegido, no permitiendo elegir un dia menor.
Además vamos a desactivar todos los días del mes, menos el último (disableNotLastDayOfMonth)
Podeis encontrar toda las opciones y documentación en:
https://angular-ui.github.io/bootstrap/
Primero definimos los campos en la página html.
Vamos a crear dos datepicker que definan un rango, no permitiendo que el rango final sea superior al inicial. Además el inicial solo podrá elegirse el primer día de un mes y para el final solo el último día de un mes.
Creamos una fecha para un rango inicial:
<div class="col-input"> <div class="form-group"> <label for="fechaInicio">Fecha de Inicio</label> <div class="input-group"> <input id="fechaInicio" name="fechaInicio" type="text" class="form-control" uib-datepicker-popup="{{$ctrl.viewModel.format}}" ng-model="$ctrl.viewModel.Dto.fechaInicio" ng-model-options="{timezone: 'utc'}" ng-change="$ctrl.viewModel.changeFechaInicio()" is-open="$ctrl.viewModel.popup1.opened" datepicker-options="$ctrl.viewModel.dateOptionsFechaInicio" ng-required="true" close-text="Cerrar" current-text="Hoy" clear-text="Limpiar" alt-input-formats="$ctrl.viewModel.altInputFormats" ng-disabled="$ctrl.viewModel.flags.disabledFechaInicio" /> <span class="input-group-btn"> <button type="button" class="btn btn-default pull-left" ng-click="$ctrl.viewModel.open1($event)"> <i class="glyphicon glyphicon-calendar"></i> </button> </span> </div> </div> </div>
Y otra fecha para el final del rango:
<div class="col-input"> <div class="form-group"> <label for="fechaFin">Fecha de Fin</label> <div class="input-group"> <input id="fechaFin" name="fechaFin" type="text" class="form-control" uib-datepicker-popup="{{$ctrl.viewModel.format}}" ng-model="$ctrl.viewModel.Dto.fechaFin" ng-model-options="{timezone: 'utc'}" ng-change="$ctrl.viewModel.changeFechaFin()" is-open="$ctrl.viewModel.popup2.opened" datepicker-options="$ctrl.viewModel.dateOptionsFechaFin" ng-required="true" close-text="Cerrar" current-text="Hoy" clear-text="Limpiar" alt-input-formats="$ctrl.viewModel.altInputFormats" ng-disabled="$ctrl.viewModel.flags.disabledFechaFin" /> <span class="input-group-btn"> <button type="button" class="btn btn-default" ng-click="$ctrl.viewModel.open2($event)"> <i class="glyphicon glyphicon-calendar"></i> </button> </span> </div> </div> </div>
Ahora vamos a definir en nuestro ViewModel de Angular las opciones de cada campo:
this.generalDateOptions = { formatYear: 'yy', startingDay: 1, showWeeks: false, prevText: ', nextText: 'Sig>', currentText: 'Hoy' }; this.dateOptionsFechaInicio = JSON.parse(JSON.stringify(this.generalDateOptions)); this.dateOptionsFechaInicio.minMode = 'month'; this.dateOptionsFechaInicio.minDate = new Date(); this.dateOptionsFechaFin = JSON.parse(JSON.stringify(this.generalDateOptions));
La variable generalDateOptions, es la configuración común a todos los campos fecha que tengamos en nuestros formularios.
Luego personalizamos algunos de los parámetros de la configuración, como por ejemplo indicamos que para la fecha de inicio, queremos selección por meses no por días (minMode='month') y que queremos que la fecha mínima seleccionamble sea la fecha actual.
A continuación vamos a preparar las funciones de callback (open1 y open2), que serán llamadas cuando se pulse en el icono para abrir el control Datepicker. Aqui vamos a hacer depender la fecha final del rango de la fecha inicial que se haya elegido, no permitiendo elegir un dia menor.
Además vamos a desactivar todos los días del mes, menos el último (disableNotLastDayOfMonth)
this.popup1 = { opened: false }; this.popup2 = { opened: false };
this.open1 = function ($event) { this.popup1.opened = true; };
this.open2 = function ($event) { this.dateOptionsFechaFin.minDate = this.Dto.fechaInicio; this.dateOptionsFechaFin.initDate = this.dateOptionsFechaFin.minDate;
// Desactivamos todos los días del mes menos el último this.dateOptionsFechaFin.dateDisabled = this.disableNotLastDayOfMonth; this.dateOptionsFechaFin.minMode = 'month'; this.popup2.opened = true; };
// Función que habilita solo las fechas que son fin de mes this.disableNotLastDayOfMonth = function (obj) { var date = obj.date, mode = obj.mode; if (date.getDate() > 27) { var comprobar = new Date(); comprobar.setFullYear(date.getFullYear(), date.getMonth() + 1, 0); if (comprobar.getDay() === date.getDay()) { return false; } } return mode === 'day' && true; };
Podeis encontrar toda las opciones y documentación en:
https://angular-ui.github.io/bootstrap/
jueves, 2 de junio de 2016
Gestión de transacciones declarativas en Spring.
Es muy interesante poder definir de forma declarativa en el código, el ámbito de nuestras transacciones.
Hay 7 tipos de propagación de las transacciones en Spring:
Hay 7 tipos de propagación de las transacciones en Spring:
- PROPAGATION_REQUIRED - Crea una nueva transacción si no existe. Si existe participa en ella. PROPAGATION_SUPPORTS - No crea una nueva transacción si no existe. Si existe participa en ella.
- PROPAGATION_MANDATORY - Si existe transacción participa en ella. Si no existe lanza una excepción.
- PROPAGATION_REQUIRES_NEW - Crea una nueva transacción. Si existe una transacción actual la suspende.
- PROPAGATION_NOT_SUPPORTED - No participa en la transacción actual y se ejecuta de forma no transaccional.
- PROPAGATION_NEVER - Si existe una transacción actualmente lanza una excepción. PROPAGATION_NESTED - Ejecuta una transacción anidada si existe una transacción actualmente. El caso más habitual es
- PROPAGATION_REQUIRED. http://www.mkyong.com/spring/spring-aop-transaction-management-in-hibernate/
martes, 31 de mayo de 2016
Conversión de fechas de cadena Java
Como formatear una fecha en una cadena tipo: "martes, 31 de mayo de 2016"
A una fecha Java.
java.text.SimpleDateFormat formatter=new SimpleDateFormat("EEEE, dd 'de' MMMM 'de' yyyy");
java.util.Date date=null;
try {
date = formatter.parse(peticionDia.getDia());
} catch (ParseException e) {
e.printStackTrace();
}
lunes, 28 de septiembre de 2015
Hibernate join con condición adicional
Puede que tengamos escrito en HQL, sentencias que realizan joins de nuestras entidades. La ventaja de Hibernate es que como conoce las dependencias, no tenemos que indicar la condición del join entre cada una de nuestras tablas.
Por ejemplo
from Cat as cat
join cat.mate as mate
left join cat.kittens as kitten
Pero que ocurre si no queremos que el join nos traiga el contenido de la tabla relacionada, bajo alguna circunstancia que se encuentra en dicha tabla relacionada.
La solución es usar la clausula "with" que se asemeja a un and, y donde podemos especificar la condición que debe cumplirse para que el join sea efectivo y devuelva la fila de la entidad relacionada.
from Cat as cat
left join cat.kittens as kitten
with kitten.bodyWeight > 10.0
Suscribirse a:
Entradas (Atom)