Saturday, June 16, 2018

Grails on Groovy > Changing default id name and type from an entity > Custom ID field > Custom ID field value generate algorithm

While developing a simple application at work I need to specify id field to some other field suppose named 'my_id' and want to use assigned value instead of using default auto_generated.
I have a table with a column named my_id of type varchar. But GORM by default auto generate an id property with the long type. The solution is straight forward, just call the method id in the mapping closure, with the following param(s):
package com.pkm

class Foo {
    String my_id

    static constraints = {}

    static mapping = {
        id generator: 'assigned', name: 'my_id'
    }
}
The generator is the strategy to auto-generate the id, you can use a sequence or something like, since it’s a string the value will be assigned, not generated. The name is the current property to bind the value (my_id in this case).
We can use our custom class to generate id of entity. For to do this, we need to define a class like below:
package com.pkm

import org.hibernate.HibernateException
import org.hibernate.engine.spi.SessionImplementor
import org.hibernate.id.IdentifierGenerator

class IdGenerator implements IdentifierGenerator {
    static Map id = [:]

    @Override
    Serializable generate(SessionImplementor session, Object o) throws HibernateException {
        String name = o.class.simpleName
        if (!id[name]) {
            id[name] = Table1.executeQuery("select max(id) from ${name}")
            if (id[name]) id[name] = id[name][0]
            else id[name] = 0
        }
        return (++id[name])
    }
}
And we need to define our class like below:
package com.pkm

class Table1 {
    Long id
    String name
    String roll

    static mapping = {
        table("table1")
        id generator: "com.pkm.IdGenerator", column:"id", unique:"true"
    }
}
If you want to globally use same configuration then you have to modify Config.groovy, you have to add below entity to Config.groovy
grails.gorm.default.mapping = {
    version false
    id generator:"com.pkm.IdGenerator", column:"id", unique:"true"
}
And finally you can browse for more information
All generators implement the interface org.hibernate.id.IdentifierGenerator. This is a very simple interface. Some applications can choose to provide their own specialized implementations, however, Hibernate provides a range of built-in implementations. The shortcut names for the built-in generators are as follows:

increment

generates identifiers of type long, short or int that are unique only when no other process is inserting data into the same table. Do not use in a cluster.

identity

supports identity columns in DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL. The returned identifier is of type long, short or int.

sequence

uses a sequence in DB2, PostgreSQL, Oracle, SAP DB, McKoi or a generator in Interbase. The returned identifier is of type long, short or int

hilo

uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a table and column (by default hibernate_unique_key and next_hi respectively) as a source of hi values. The hi/lo algorithm generates identifiers that are unique only for a particular database.

seqhilo

uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a named database sequence.

uuid

uses a 128-bit UUID algorithm to generate identifiers of type string that are unique within a network (the IP address is used). The UUID is encoded as a string of 32 hexadecimal digits in length.

guid

uses a database-generated GUID string on MS SQL Server and MySQL.

native

selects identity, sequence or hilo depending upon the capabilities of the underlying database.

assigned

lets the application assign an identifier to the object before save() is called. This is the default strategy if no element is specified.

select

retrieves a primary key, assigned by a database trigger, by selecting the row by some unique key and retrieving the primary key value.

foreign

uses the identifier of another associated object. It is usually used in conjunction with a primary key association.

sequence-identity

a specialized sequence generation strategy that utilizes a database sequence for the actual value generation, but combines this with JDBC3 getGeneratedKeys to return the generated identifier value as part of the insert statement execution. This strategy is only supported on Oracle 10g drivers targeted for JDK 1.4. Comments on these insert statements are disabled due to a bug in the Oracle drivers.

Grails on Groovy > Grails 2.X > How is the invocation sequence of Grails filters defined | Sequence of Filter Execution

I am using filters to handle authentication and some other pre-condition checks for a Grails application. I've run into a situation where it'd be nice to ensure that filter A is always invoked before filter B
If several filters are declared within one class, it's obvious that they'll be executed in the order that they were declared like below code block.
package com.pkm

class SecurityFilters {

    def filters = {
        filter1(controller:'*', action:'*') {
            before = {
                println("FILTER-1")
            }
            after = { Map model ->

            }
            afterView = { Exception e ->

            }
        }

        filter2(uri: "/**") {
            before = {
                println("FILTER-2")
            }
            after = { Map model ->

            }
            afterView = { Exception e ->

            }
        }
    }
}
Now what will happen if they would defined in different classes. Yes, there is a way around and that is dependsOn. You can define dependsOn on which filter it will depend on. Say I created another filter named Security2Filters and set my first filter named SecurityFilters to dependsOn. So SecirutyFilters will be execute before Security2Filters.
package com.pkm

class Security2Filters {
    def dependsOn=[SecurityFilters]

    def filters = {
        all(controller:'*', action:'*') {
            before = {
                println("FILTER-3")
            }
            after = { Map model ->

            }
            afterView = { Exception e ->

            }
        }
    }
}

Grails on Groovy > Grails 2 > How to know programmatically if a view or a layout file exists in grails | Check if view or layout file exists

I want to know programmatically if a view or a layout exists in grails.
Since Grails 2.0, you can inject a GrailsConventionGroovyPageLocator:
package com.pkm

import org.codehaus.groovy.grails.web.pages.discovery.GrailsConventionGroovyPageLocator

class HomeController {
    GrailsConventionGroovyPageLocator groovyPageLocator

    def index() {
        println(groovyPageLocator.findView("myView"))
        println(groovyPageLocator.findViewByPath("/home/myView"))
        println(groovyPageLocator.findTemplate("myTemplate"))
        println(groovyPageLocator.findTemplateByPath("/home/myTemplate"))
        render(text: "Done")
    }
}
Will output like below, it no view found, null return.
URL [file:C:/Grails-project-path/grails-app/views/home/myView.gsp]

URL [file:C:/Grails-project-path/grails-app/views/home/myView.gsp]

URL [file:C:/Grails-project-path/grails-app/views/home/_myTemplate.gsp]

URL [file:C:/Grails-project-path/grails-app/views/home/_myTemplate.gsp]

Grails on Groovy | From within a grails HQL, how would I use a MySQL / Oracle Native Function | HQL Query use MySQL Native Functions | Register Functions for MySQL Native Support

To call a MySQL native function in HQL query builder, the SQL dialect must be aware of it. You can add your function at runtime in BootStrap.groovy like this:

import org.codehaus.groovy.grails.commons.GrailsApplication
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes
import org.hibernate.dialect.function.SQLFunctionTemplate
import org.hibernate.type.StringType
import org.springframework.context.ApplicationContext

class BootStrap {
    def init = { servletContext ->
        ApplicationContext applicationContext = servletContext.getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
        GrailsApplication application = (GrailsApplication) applicationContext.getBean("grailsApplication")

        def dialect = applicationContext.sessionFactory.dialect
        def MyFunction = new SQLFunctionTemplate(StringType.INSTANCE, "MyFunction(?1)")
        dialect.registerFunction('MyFunction', MyFunction)
    }

    def destroy = {

    }
}
MySQL native function registered with our Grails project, now we are able to call the function in our HQL queries like below:

package com.pkm

import grails.transaction.Transactional

@Transactional
class HomeService {
    void callMe() {
        List result = Table1.executeQuery("select id,name,roll,MyFunction(id) from Table1")
        println(result)
    }
}
MySQL > Create Function > Call MySQL Function > Execution MySQL Function > MysQL Show Listed Functions

MySQL find_in_set Sith Multiple Search String | MySQL Variable With Multiple Values | MySQL Use of REGEXP | Search IN With Multiple Values

Problem is like below:
We know that find_in_set only search by a single string

find_in_set('2', '2,4,6,8')

In the above example, '2' is the only string used for search.

So we are looking for if there is any way to use find_in_set kind of functionality and search by multiple strings, like

find_in_set('2,4,6', '2,3,4,6,8,10')
The only solution is to use REGEXP
where CONCAT(",", t2.id, ",") REGEXP ",(2|4|6|8|10),"
Full query would be like below:
SELECT
  t1.*,
  SUM(t2.score)                               AS score_total,
  GROUP_CONCAT(t2.subject ORDER BY t2.id ASC) AS subjects,
  GROUP_CONCAT(t2.id ORDER BY t2.id ASC)      AS t2_id
FROM table1 t1 JOIN table2_child t2 ON (t1.id = t2.table1_id)
WHERE CONCAT(",", t2.id, ",") REGEXP ",(2|4|6|8|10),"
GROUP BY t1.id


HTML + CSS TRICKS, FLOAT LEFT DIV WITH EQUAL HEIGHT, MAGIC OF USING FLEX - CSS BEGINING



<section class="container">
    <div class="left-half">
        <article>
            <h1>Left Half 1</h1>
        </article>
    </div>
    <div class="left-half">
        <article>
            <h1>Left Half 2</h1>
        </article>
    </div>
    <div class="left-half">
        <article>
            <h1>Left Half 3</h1>

            <p>Weekends don't</p>
        </article>
    </div>
    <div class="left-half">
        <article>
            <h1>Left Half 4</h1>

            <p>Weekends don't</p>

            <p>Weekends don't</p>
        </article>
    </div>
    <div class="left-half">
        <article>
            <h1>Left Half 5</h1>

            <p>Weekends don't</p>

            <p>Weekends don't</p>
        </article>
    </div>
    <div class="left-half">
        <article>
            <h1>Left Half 6</h1>

            <p>Weekends don't</p>
        </article>
    </div>
</section>

html, body, section {
    height: 100%;
}

body {
    color: #fff;
    font-family: sans-serif;
    font-size: 1.25rem;
    line-height: 150%;
    text-align: center;
    text-shadow: 0 2px 2px #b6701e;
}

h1 {
    font-size: 1.75rem;
    margin: 0 0 0.75rem 0;
}

.container {
    display: flex;
    flex-flow: row wrap;
    justify-content: flex-start;
}

.left-half {
    background-color: #ff9e2c;
    padding: 0;
    width: calc(50% - 6px);
    border: 2px solid red;
    display: flex;
    justify-content: flex-start;
    align-items: flex-start;
}

Jsfiddle link

Friday, June 8, 2018

$(window).width() AND $(window).outerWidth() excluding the scrollbar width > Window and viewport width in CSS and Javascript

It is very unpleasant that $(window).width() or $(window).outerWidth() does not return actual view port width scroll bar width. Especially when trying to match the window width to the CSS media queries.
Currently if you have a media query for responsive design with the CSS like:
@media screen and (max-width: 1600px) {
  body {background: red;}
}
When the background color is actually applied to the document by the browser, jQuery tells the window width is less than 1600px (1600 - scrollbar width). But you know its not the expected result.
This is very unpleasant situation cases where there are some mobile-specific stuff that needs to be done in both, CSS and JS. And they would need to be done at the exactly same width of the document/window.
However, plain JavaScript returns 1600 as the window width when asked using below code snippet:
window.innerWidth