Как позвонить в службу Grails из gsp?

Использование join (в случае связей это приведет к более чем одной строке в группе):

import pyspark.sql.functions as F
from pyspark.sql.functions import count, col 

cnts = df.groupBy("id_sa", "id_sb").agg(count("*").alias("cnt")).alias("cnts")
maxs = cnts.groupBy("id_sa").agg(F.max("cnt").alias("mx")).alias("maxs")

cnts.join(maxs, 
  (col("cnt") == col("mx")) & (col("cnts.id_sa") == col("maxs.id_sa"))
).select(col("cnts.id_sa"), col("cnts.id_sb"))

Использование оконных функций (приведет к удалению связей):

from pyspark.sql.functions import row_number
from pyspark.sql.window import Window

w = Window().partitionBy("id_sa").orderBy(col("cnt").desc())

(cnts
  .withColumn("rn", row_number().over(w))
  .where(col("rn") == 1)
  .select("id_sa", "id_sb"))

Использование порядка struct:

from pyspark.sql.functions import struct

(cnts
  .groupBy("id_sa")
  .agg(F.max(struct(col("cnt"), col("id_sb"))).alias("max"))
  .select(col("id_sa"), col("max.id_sb")))

См. также Как выбрать первую строку каждой группы?

29
задан cdeszaq 4 January 2013 в 00:33
поделиться

4 ответа

<%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>

И тогда вы можете вызвать ${myService.method()} в своем представлении gsp

Имейте в виду, что вызов транзакционных методов обслуживания из представлений снижает производительность. Лучше перенести все вызовы методов транзакционного обслуживания на контроллер (если вы можете)

12
ответ дан fabien7474 4 January 2013 в 00:33
поделиться

Лучше всего использовать библиотеку тегов, поскольку создание экземпляра службы непосредственно в представлении через загрузчик классов НЕ БУДЕТ автоматически связывать другие объявленные службы, которые могут жить в службе, которую вы пытаетесь использовать.

Используя библиотеку тегов, вы будете автоматически подключать эти службы.

В вашем представлении gsp <g:customTag param1="$modelObjec" param2="someString" />

В вашей папке taglib (yourApp/grails-app/taglib/com/something/MyAppTagLib):

package com.something

class MyAppTagLib {

    def myService  // This will be auto-wired

    def customTag = { attribs ->
        def modelObj = attribs['param1']
        def someString = attribs['param2']

        // Do something with the params

        myService.method()

        out << "I just used method of MyService class"
    }
}

MyService:

package com.something

class MyService {

def anotherService // This will be auto-wired

def method() {
    anotherService.anotherMethod()
}

}
41
ответ дан starryknight64 4 January 2013 в 00:33
поделиться

Попробуйте - очень полезно

%{--Use BlogService--}%
<g:set var="blog" bean="blogService"/>

<ul>
    <g:each in="${blog.allTitles()}" var="title">
        <li>${title}</li>
    </g:each>
</ul>

См. Это

Также это не рекомендуемая вещь, вы всегда можете использовать taglib

31
ответ дан Suganthan Madhavan Pillai 4 January 2013 в 00:33
поделиться

Я думаю, что лучший способ сделать это:

<%
    def myService = grailsApplication.mainContext.getBean("myService");
%>

Таким образом, вы получаете экземпляр службы, не теряя автоматические услуги.

22
ответ дан David Paulo 4 January 2013 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: