1

プロジェクトで問題が発生したため、コミュニティに助けを求めています。

私は ColdFusion にあまり慣れていない (12 年前に少しいじりましたが、それ以来進化していることを理解しています)、Coldbox や Hibernate にはまったく慣れていないことを前置きします。

データベースからイベント エンティティのリストを取得し、それを JSON 形式で返す Coldbox ハンドラー (以下を参照) があります。現在、これは問題なく動作します (問題領域外のすべて)。ただし、Quantifications と呼ばれる別のテーブルでイベントのリストをフィルター処理する必要があります。基本的に、a) 数量化が関連付けられており、b) ステータスが「アクティブ」の数量化が少なくとも 1 つあるすべてのイベントを照合する必要があります。

これを処理する論理的な方法がいくつかありました。最初の (そして理想的ではない) 方法は、単純にすべての結果を取得し、後でそれらを一連のループでフィルター処理することでした。ただし、これはコストが高く、ページングが台無しになるため、このアイデアは破棄しました。

2 つ目は、Quantifications テーブルで結合を行い、すべてのアクティブな数量化とそれに対応するイベントを返すことでした。ただし、重複が発生しており、ColdboxresultTransformerは実際には機能していないようです -DISTINCT_ROOT_ENTITY個別のエンティティを返していません。(また、コード参照が大幅に不足しており、コードを簡単にステップ実行する方法がありません。)

私の最終的なアイデアは次のとおりです。イベントごとに、イベントに関連付けられている定量化の定量化テーブルのサブクエリを実行し、アクティブな数のカウントを取得します。カウントが正の場合、イベントを返します。

Coldbox と Hibernate でこれを機能させるにはどうすればよいですか? 私は自分が何をしたいのか (そして問題を論理的に解決する方法) を知っていますが、このシステムで、これらのツールとこの構文を使用してそれを行う方法についてはほとんど考えていません。残念ながら、それを理解する時間はほとんどありません。アウト。ありがとうございました!

<cfscript>
component extends="handlers._jsonApi" {

    property name='statusService' inject='entityService:EventStatus';
    property name='departmentService' inject='entityService:Department';
    property name='myEventService' inject='id:myEventService';
    property name='quantificationService' inject='entityService:Quantification';

    ///api/v1/events?departmentId=[XXX]&date=[2013-08-02]&showEventsWithoutQuantifications[false|true]
    function index(event,rc,prc){

        var myEventCriteria = myEventService.newCriteria();

        //if a date is passed, display events occuring that date
        if (StructKeyExists(rc, "date")){
            if (isDate(rc.date)){
                var date = createODBCDateTime(rc.date);
            } else {
                addMessage("The date passed (#rc.date#) is invalid. The date must be in the following format: YYYY-MM-DD.", "error");
                return;
            }

        } else {//else display events occurring today

            var date = createODBCDateTime(now());

        }

        myEventCriteria.le("startDate", date);
        myEventCriteria.ge("endDate", date);

        //if a department id is passed, restrict events to that department
        if (( StructKeyExists(rc, "departmentId")) AND (len(rc.departmentId))){

            var departmentId = rc.departmentId;
            var department = departmentService.findWhere(entityName="Department", criteria={departmentId=departmentId});

            if (isNull(department)){
                addMessage("'#rc.departmentId#' is not a valid departmentId.", "error");
                return;         
            }

            myEventCriteria.isEq("department", department);
        }

        var showEventsWithoutQuantifications = false;
        if (StructKeyExists(rc, "showEventsWithoutQuantifications")){
            if (rc.showEventsWithoutQuantifications)    showEventsWithoutQuantifications = true;
        }

        if (NOT showEventsWithoutQuantifications){
            myEventCriteria.isNotEmpty('quantifications');
        }

/* PROBLEM AREA */
        // Filter events to only include those that have approved quantifications.
        var statusId = 150;
        var status = statusService.findWhere(entityName="EventStatus", criteria={eventStatusOrder=statusId});

        myEventCriteria.createAlias("quantifications", "qt").isEq("qt.status", status);
        myEventCriteria.withProjections(countDistinct="eventID");

        myEventCriteria.resultTransformer( myEventCriteria.DISTINCT_ROOT_ENTITY );

/* // PROBLEM AREA */

        var recordCount = myEventCriteria.count();

        //the order needs to be set after the count is retrieved, or it returns an error
        //myEventCriteria.order('startDate', 'asc');
        myEventCriteria.order('eventID', 'asc');

        var pageSize = getSetting("defaultPageSize");
        if (StructKeyExists(rc, "pageSize") AND Len(rc.pageSize))   pageSize = rc.pageSize;

        myEventCriteria.maxResults(pageSize);

        if (recordCount GT pageSize){

            var firstResult = 0;
            var pageNumber = 1;
            var pageCount = Ceiling(recordCount / pageSize);
            if (StructKeyExists(rc, "pageNumber") AND Len(rc.pageNumber)){
                pageNumber = rc.pageNumber;
                if (pageNumber LT 0 OR pageNumber GT pageCount){
                    addMessage("The pageNumber must be between 1 and #pageCount#", "error");
                    return;
                }

                firstResult = (pageNumber - 1) * pageSize;
                myEventCriteria.firstResult(firstResult);
            }

            var paging = StructNew();
            paging['pageSize'] = pageSize;
            paging['pageNumber'] = pageNumber;
            paging['pageCount'] = pageCount;
            paging['recordCount'] = recordCount;

            prc.response['paging'] = paging;
        }

        prc.response['events'] = objectsToStructs(myEventCriteria.list(), "eventID,eventName,eventCity,eventState,eventVenue,startDate,endDate,justfication,department.departmentID,department.departmentName,country.countryID,country.countryCode,country.countryName,country.countryRegion,signInSummary.signInSummaryID,signInSummary.signInSummary,serviceType.serviceTypeID,serviceType.serviceTypeName" );

    }//end index


}//end component

</cfscript>
4

0 に答える 0