Search in sources :

Example 11 with StructImpl

use of lucee.runtime.type.StructImpl in project Lucee by lucee.

the class Search method doStartTag.

@Override
public int doStartTag() throws PageException {
    // SerialNumber sn = pageContext.getConfig().getSerialNumber();
    // if(sn.getVersion()==SerialNumber.VERSION_COMMUNITY)
    // throw new SecurityException("no access to this functionality with the "+sn.getStringVersion()+" version of Lucee");
    final String v = "VARCHAR", d = "DOUBLE";
    String[] cols = new String[] { "title", "url", "summary", "score", "recordssearched", "key", "custom1", "custom2", "custom3", "custom4", "categoryTree", "category", "context", "size", "rank", "author", "type", "collection" };
    // TODO support context
    String[] types = new String[] { v, v, v, d, d, v, v, v, v, v, v, v, v, d, d, v, v, v };
    SearchData data = pageContext.getConfig().getSearchEngine(pageContext).createSearchData(suggestions);
    // this is already here to make sure the classloader load this sinstance
    SuggestionItem item = null;
    lucee.runtime.type.Query qry = new QueryImpl(cols, types, 0, "query");
    SearchCollection collection;
    long time = System.currentTimeMillis();
    AddionalAttrs.setAddionalAttrs(contextBytes, contextPassages, contextHighlightBegin, contextHighlightEnd);
    try {
        for (int i = 0; i < collections.length; i++) {
            collection = collections[i];
            startrow = collection.search(data, qry, criteria, collection.getLanguage(), type, startrow, maxrows, categoryTree, category);
            if (maxrows >= 0 && qry.getRecordcount() >= maxrows)
                break;
        }
        pageContext.setVariable(name, qry);
    } catch (SearchException se) {
        throw Caster.toPageException(se);
    } finally {
        AddionalAttrs.removeAddionalAttrs();
    }
    time = System.currentTimeMillis() - time;
    Double recSearched = new Double(data.getRecordsSearched());
    int len = qry.getRecordcount();
    for (int i = 1; i <= len; i++) {
        qry.setAt("recordssearched", i, recSearched);
    }
    // status
    if (status != null) {
        Struct sct = new StructImpl();
        pageContext.setVariable(status, sct);
        sct.set(FOUND, new Double(qry.getRecordcount()));
        sct.set(SEARCHED, recSearched);
        sct.set(KeyConstants._time, new Double(time));
        // TODO impl this values
        Map s = data.getSuggestion();
        if (s.size() > 0) {
            String key;
            Iterator it = s.keySet().iterator();
            Struct keywords = new StructImpl();
            Struct keywordScore = new StructImpl();
            sct.set(KEYWORDS, keywords);
            sct.set(KEYWORD_SCORE, keywordScore);
            Object obj;
            while (it.hasNext()) {
                key = (String) it.next();
                // the problem is a conflict between the SuggestionItem version from core and extension
                obj = s.get(key);
                if (obj instanceof SuggestionItem) {
                    item = (SuggestionItem) obj;
                    keywords.set(key, item.getKeywords());
                    keywordScore.set(key, item.getKeywordScore());
                } else {
                    Class clazz = obj.getClass();
                    try {
                        keywords.set(key, clazz.getMethod("getKeywords", new Class[0]).invoke(obj, new Object[0]));
                        keywordScore.set(key, clazz.getMethod("getKeywordScore", new Class[0]).invoke(obj, new Object[0]));
                    } catch (Exception e) {
                    }
                }
            }
            String query = data.getSuggestionQuery();
            if (query != null) {
                String html = StringUtil.replace(query, "<suggestion>", "<b>", false);
                html = StringUtil.replace(html, "</suggestion>", "</b>", false);
                sct.set("suggestedQueryHTML", html);
                String plain = StringUtil.replace(query, "<suggestion>", "", false);
                plain = StringUtil.replace(plain, "</suggestion>", "", false);
                sct.set("suggestedQuery", plain);
            }
        }
    // if(suggestions!=SUGGESTIONS_NEVER)sct.set("suggestedQuery", "");
    // sct.set("keywords", "");
    // sct.set("keywordScore", "");
    }
    return SKIP_BODY;
}
Also used : SearchData(lucee.runtime.search.SearchData) SuggestionItem(lucee.runtime.search.SuggestionItem) SearchCollection(lucee.runtime.search.SearchCollection) SearchException(lucee.runtime.search.SearchException) ApplicationException(lucee.runtime.exp.ApplicationException) SearchException(lucee.runtime.search.SearchException) PageException(lucee.runtime.exp.PageException) Struct(lucee.runtime.type.Struct) QueryImpl(lucee.runtime.type.QueryImpl) StructImpl(lucee.runtime.type.StructImpl) Iterator(java.util.Iterator) Map(java.util.Map)

Example 12 with StructImpl

use of lucee.runtime.type.StructImpl in project Lucee by lucee.

the class StoredProc method doEndTag.

@Override
public int doEndTag() throws PageException {
    long startNS = System.nanoTime();
    Object ds = datasource;
    if (StringUtil.isEmpty(datasource)) {
        ds = pageContext.getApplicationContext().getDefDataSource();
        if (StringUtil.isEmpty(ds)) {
            boolean isCFML = pageContext.getRequestDialect() == CFMLEngine.DIALECT_CFML;
            throw new ApplicationException("attribute [datasource] is required, when no default datasource is defined", "you can define a default datasource as attribute [defaultdatasource] of the tag " + (isCFML ? Constants.CFML_APPLICATION_TAG_NAME : Constants.LUCEE_APPLICATION_TAG_NAME) + " or as data member of the " + (isCFML ? Constants.CFML_APPLICATION_EVENT_HANDLER : Constants.LUCEE_APPLICATION_EVENT_HANDLER) + " (this.defaultdatasource=\"mydatasource\";)");
        }
    }
    Struct res = new StructImpl();
    DataSourceManager manager = pageContext.getDataSourceManager();
    DatasourceConnection dc = ds instanceof DataSource ? manager.getConnection(pageContext, (DataSource) ds, username, password) : manager.getConnection(pageContext, Caster.toString(ds), username, password);
    // create returnValue
    returnValue(dc);
    String sql = createSQL();
    // add returnValue to params
    if (returnValue != null) {
        params.add(0, returnValue);
    }
    Log log = pageContext.getConfig().getLog("datasource");
    SQLImpl _sql = new SQLImpl(sql);
    CallableStatement callStat = null;
    try {
        if (// log entry added to troubleshoot LDEV-1147
        log.getLogLevel() >= Log.LEVEL_DEBUG)
            log.debug("LDEV1147", sql + " [" + params.size() + " params]");
        callStat = dc.getConnection().prepareCall(sql);
        if (blockfactor > 0)
            callStat.setFetchSize(blockfactor);
        if (timeout > 0)
            DataSourceUtil.setQueryTimeoutSilent(callStat, timeout);
        // set IN register OUT
        Iterator<ProcParamBean> it = params.iterator();
        ProcParamBean param;
        int index = 1;
        while (it.hasNext()) {
            param = it.next();
            param.setIndex(index);
            _sql.addItems(new SQLItemImpl(param.getValue()));
            if (param.getDirection() != ProcParamBean.DIRECTION_OUT) {
                SQLCaster.setValue(pageContext, pageContext.getTimeZone(), callStat, index, param);
            }
            if (param.getDirection() != ProcParamBean.DIRECTION_IN) {
                registerOutParameter(callStat, param);
            }
            index++;
        }
        String dsn = (ds instanceof DataSource) ? ((DataSource) ds).getName() : Caster.toString(ds);
        // cache
        boolean isFromCache = false;
        Object cacheValue = null;
        boolean useCache = (cachedWithin != null) || (cachedafter != null);
        String cacheId = null;
        CacheHandler cacheHandler = null;
        if (useCache) {
            cacheId = CacheHandlerCollectionImpl.createId(_sql, dsn, username, password, Query.RETURN_TYPE_STORED_PROC);
            cacheHandler = pageContext.getConfig().getCacheHandlerCollection(Config.CACHE_TYPE_QUERY, null).getInstanceMatchingObject(cachedWithin, null);
            if (cacheHandler instanceof CacheHandlerPro) {
                CacheItem cacheItem = ((CacheHandlerPro) cacheHandler).get(pageContext, cacheId, cachedWithin);
                if (cacheItem != null)
                    cacheValue = ((StoredProcCacheItem) cacheItem).getStruct();
            } else if (cacheHandler != null) {
                // TODO this else block can be removed when all cache handlers implement CacheHandlerPro
                CacheItem cacheItem = cacheHandler.get(pageContext, cacheId);
                if (cacheItem != null)
                    cacheValue = ((StoredProcCacheItem) cacheItem).getStruct();
            // cacheValue = pageContext.getQueryCache().get(pageContext,_sql,dsn,username,password,cachedafter);
            }
        }
        int count = 0;
        long start = System.currentTimeMillis();
        if (cacheValue == null) {
            // execute
            boolean isResult = callStat.execute();
            Struct cacheStruct = useCache ? new StructImpl() : null;
            // resultsets
            ProcResultBean result;
            index = 1;
            do {
                if (isResult) {
                    ResultSet rs = callStat.getResultSet();
                    if (rs != null) {
                        try {
                            result = (ProcResultBean) results.get(index++, null);
                            if (result != null) {
                                lucee.runtime.type.Query q = new QueryImpl(rs, result.getMaxrows(), result.getName(), pageContext.getTimeZone());
                                count += q.getRecordcount();
                                setVariable(result.getName(), q);
                                if (useCache)
                                    cacheStruct.set(KeyImpl.getInstance(result.getName()), q);
                            }
                        } finally {
                            IOUtil.closeEL(rs);
                        }
                    }
                }
            } while ((isResult = callStat.getMoreResults()) || (callStat.getUpdateCount() != -1));
            // params
            it = params.iterator();
            while (it.hasNext()) {
                param = it.next();
                if (param.getDirection() != ProcParamBean.DIRECTION_IN) {
                    Object value = null;
                    if (!StringUtil.isEmpty(param.getVariable())) {
                        try {
                            value = SQLCaster.toCFType(callStat.getObject(param.getIndex()));
                        } catch (Throwable t) {
                            ExceptionUtil.rethrowIfNecessary(t);
                        }
                        value = emptyIfNull(value);
                        if (param == STATUS_CODE)
                            res.set(STATUSCODE, value);
                        else
                            setVariable(param.getVariable(), value);
                        if (useCache)
                            cacheStruct.set(KeyImpl.getInstance(param.getVariable()), value);
                    }
                }
            }
            if (cacheHandler != null) {
                cacheStruct.set(COUNT, Caster.toDouble(count));
                cacheHandler.set(pageContext, cacheId, cachedWithin, new StoredProcCacheItem(cacheStruct, procedure, System.currentTimeMillis() - start));
            // pageContext.getQueryCache().set(pageContext,_sql,dsn,username,password,cache,cachedbefore);
            }
        } else if (cacheValue instanceof Struct) {
            Struct sctCache = (Struct) cacheValue;
            count = Caster.toIntValue(sctCache.removeEL(COUNT), 0);
            Iterator<Entry<Key, Object>> cit = sctCache.entryIterator();
            Entry<Key, Object> ce;
            while (cit.hasNext()) {
                ce = cit.next();
                if (STATUS_CODE.getVariable().equals(ce.getKey().getString()))
                    res.set(KEY_SC, ce.getValue());
                else
                    setVariable(ce.getKey().getString(), ce.getValue());
            }
            isFromCache = true;
        }
        // result
        long exe;
        setVariable(this.result, res);
        res.set(KeyConstants._executionTime, Caster.toDouble(exe = (System.nanoTime() - startNS)));
        res.set(KeyConstants._cached, Caster.toBoolean(isFromCache));
        if (pageContext.getConfig().debug() && debug) {
            boolean logdb = ((ConfigImpl) pageContext.getConfig()).hasDebugOptions(ConfigImpl.DEBUG_DATABASE);
            if (logdb)
                pageContext.getDebugger().addQuery(null, dsn, procedure, _sql, count, pageContext.getCurrentPageSource(), (int) exe);
        }
        // log
        if (log.getLogLevel() >= Log.LEVEL_INFO) {
            log.info(StoredProc.class.getSimpleName(), "executed [" + sql.trim() + "] in " + DecimalFormat.call(pageContext, exe / 1000000D) + " ms");
        }
    } catch (SQLException e) {
        // log
        log.error(StoredProc.class.getSimpleName(), e);
        throw new DatabaseException(e, new SQLImpl(sql), dc);
    } catch (PageException pe) {
        // log
        log.error(StoredProc.class.getSimpleName(), pe);
        throw pe;
    } finally {
        if (callStat != null) {
            try {
                callStat.close();
            } catch (SQLException e) {
            }
        }
        manager.releaseConnection(pageContext, dc);
    }
    return EVAL_PAGE;
}
Also used : SQLImpl(lucee.runtime.db.SQLImpl) DatasourceConnection(lucee.runtime.db.DatasourceConnection) SQLException(java.sql.SQLException) DataSourceManager(lucee.runtime.db.DataSourceManager) Struct(lucee.runtime.type.Struct) StoredProcCacheItem(lucee.runtime.cache.tag.query.StoredProcCacheItem) QueryImpl(lucee.runtime.type.QueryImpl) Entry(java.util.Map.Entry) CallableStatement(java.sql.CallableStatement) CacheHandlerPro(lucee.runtime.cache.tag.CacheHandlerPro) ResultSet(java.sql.ResultSet) Iterator(java.util.Iterator) SQLItemImpl(lucee.runtime.db.SQLItemImpl) PageException(lucee.runtime.exp.PageException) Log(lucee.commons.io.log.Log) DataSource(lucee.runtime.db.DataSource) ApplicationException(lucee.runtime.exp.ApplicationException) StructImpl(lucee.runtime.type.StructImpl) CacheItem(lucee.runtime.cache.tag.CacheItem) StoredProcCacheItem(lucee.runtime.cache.tag.query.StoredProcCacheItem) CacheHandler(lucee.runtime.cache.tag.CacheHandler) DatabaseException(lucee.runtime.exp.DatabaseException) Key(lucee.runtime.type.Collection.Key) ConfigImpl(lucee.runtime.config.ConfigImpl)

Example 13 with StructImpl

use of lucee.runtime.type.StructImpl in project Lucee by lucee.

the class TagUtil method addTagMetaData.

/**
 * load metadata from cfc based custom tags and add the info to the tag
 * @param cs
 * @param config
 */
public static void addTagMetaData(ConfigWebImpl cw) {
    if (true)
        return;
    PageContextImpl pc = null;
    try {
        pc = ThreadUtil.createPageContext(cw, DevNullOutputStream.DEV_NULL_OUTPUT_STREAM, "localhost", "/", "", new Cookie[0], new Pair[0], null, new Pair[0], new StructImpl(), false, -1);
    } catch (Throwable t) {
        ExceptionUtil.rethrowIfNecessary(t);
        return;
    }
    PageContext orgPC = ThreadLocalPageContext.get();
    try {
        ThreadLocalPageContext.register(pc);
        // MUST MOST of them are the same, so this is a huge overhead
        _addTagMetaData(pc, cw, CFMLEngine.DIALECT_CFML);
        _addTagMetaData(pc, cw, CFMLEngine.DIALECT_LUCEE);
    } catch (Throwable t) {
        ExceptionUtil.rethrowIfNecessary(t);
    } finally {
        pc.getConfig().getFactory().releaseLuceePageContext(pc, true);
        ThreadLocalPageContext.register(orgPC);
    }
}
Also used : Cookie(javax.servlet.http.Cookie) StructImpl(lucee.runtime.type.StructImpl) ThreadLocalPageContext(lucee.runtime.engine.ThreadLocalPageContext) PageContext(lucee.runtime.PageContext) PageContextImpl(lucee.runtime.PageContextImpl) Pair(lucee.commons.lang.Pair)

Example 14 with StructImpl

use of lucee.runtime.type.StructImpl in project Lucee by lucee.

the class ThreadTag method setDynamicAttribute.

@Override
public void setDynamicAttribute(String uri, String name, Object value) {
    if (attrs == null)
        attrs = new StructImpl();
    Key key = KeyImpl.getInstance(StringUtil.trim(name, ""));
    attrs.setEL(key, value);
}
Also used : StructImpl(lucee.runtime.type.StructImpl) Key(lucee.runtime.type.Collection.Key)

Example 15 with StructImpl

use of lucee.runtime.type.StructImpl in project Lucee by lucee.

the class Admin method doGetCacheDefaultConnection.

private void doGetCacheDefaultConnection() throws PageException {
    int type;
    String strType = getString("admin", "GetCacheDefaultConnection", "cacheType");
    strType = strType.toLowerCase().trim();
    if (strType.equals("object"))
        type = ConfigImpl.CACHE_TYPE_OBJECT;
    else if (strType.equals("template"))
        type = ConfigImpl.CACHE_TYPE_TEMPLATE;
    else if (strType.equals("query"))
        type = ConfigImpl.CACHE_TYPE_QUERY;
    else if (strType.equals("resource"))
        type = ConfigImpl.CACHE_TYPE_RESOURCE;
    else if (strType.equals("function"))
        type = ConfigImpl.CACHE_TYPE_FUNCTION;
    else if (strType.equals("include"))
        type = ConfigImpl.CACHE_TYPE_INCLUDE;
    else if (strType.equals("http"))
        type = ConfigImpl.CACHE_TYPE_HTTP;
    else if (strType.equals("file"))
        type = ConfigImpl.CACHE_TYPE_FILE;
    else if (strType.equals("webservice"))
        type = ConfigImpl.CACHE_TYPE_WEBSERVICE;
    else
        throw new ApplicationException("inv,query,resourcealid type defintion, valid values are [object,template,query,resource,function,include]");
    CacheConnection cc = config.getCacheDefaultConnection(type);
    if (cc != null) {
        Struct sct = new StructImpl();
        sct.setEL(KeyConstants._name, cc.getName());
        sct.setEL(KeyConstants._class, cc.getClassDefinition().getClassName());
        sct.setEL(KeyConstants._bundleName, cc.getClassDefinition().getName());
        sct.setEL(KeyConstants._bundleVersion, cc.getClassDefinition().getVersionAsString());
        sct.setEL(KeyConstants._custom, cc.getCustom());
        sct.setEL(KeyConstants._default, Caster.toBoolean(true));
        sct.setEL(KeyConstants._readonly, Caster.toBoolean(cc.isReadOnly()));
        pageContext.setVariable(getString("admin", action, "returnVariable"), sct);
    } else
        throw new ApplicationException("there is no cache default connection");
}
Also used : ApplicationException(lucee.runtime.exp.ApplicationException) StructImpl(lucee.runtime.type.StructImpl) CacheConnection(lucee.runtime.cache.CacheConnection) Struct(lucee.runtime.type.Struct)

Aggregations

StructImpl (lucee.runtime.type.StructImpl)251 Struct (lucee.runtime.type.Struct)216 PageException (lucee.runtime.exp.PageException)40 Entry (java.util.Map.Entry)34 Key (lucee.runtime.type.Collection.Key)28 Array (lucee.runtime.type.Array)25 ArrayImpl (lucee.runtime.type.ArrayImpl)24 ApplicationException (lucee.runtime.exp.ApplicationException)21 IOException (java.io.IOException)19 Map (java.util.Map)19 Resource (lucee.commons.io.res.Resource)18 Iterator (java.util.Iterator)17 PageContextImpl (lucee.runtime.PageContextImpl)14 QueryImpl (lucee.runtime.type.QueryImpl)13 Collection (lucee.runtime.type.Collection)11 Query (lucee.runtime.type.Query)11 DateTimeImpl (lucee.runtime.type.dt.DateTimeImpl)11 HashMap (java.util.HashMap)9 PageSource (lucee.runtime.PageSource)8 Element (org.w3c.dom.Element)8