protected void loadKeyValueCollectionLoader(ScreenData screenData, Element element, KeyValueCollectionContainer container, @Nullable ScreenData hostScreenData) { KeyValueCollectionLoader loader; String loaderId = element.attributeValue("id"); if (loaderId == null) { loaderId = generateId(); } if (checkProvided(element, hostScreenData)) { //noinspection ConstantConditions loader = hostScreenData.getLoader(loaderId); } else { loader = factory.createKeyValueCollectionLoader(); loader.setContainer(container); loadQuery(element, loader); loadSoftDeletion(element, loader); loadFirstResult(element, loader); loadMaxResults(element, loader); String storeName = element.attributeValue("store"); if (!Strings.isNullOrEmpty(storeName)) loader.setStoreName(storeName); } screenData.registerLoader(loaderId, loader); }
@SuppressWarnings("unchecked") @Override public int getCount() { if (loader == null) { return container.getItems().size(); } if (loader instanceof CollectionLoader) { return (int) dataManager.getCount(((CollectionLoader) loader).createLoadContext()); } else if (loader instanceof KeyValueCollectionLoader) { ValueLoadContext context = ((KeyValueCollectionLoader) loader).createLoadContext(); QueryTransformer transformer = QueryTransformerFactory.createTransformer(context.getQuery().getQueryString()); // TODO it doesn't work for query containing scalars in select transformer.replaceWithCount(); context.getQuery().setQueryString(transformer.getResult()); context.setProperties(Collections.singletonList("cnt")); List<KeyValueEntity> list = dataManager.loadValues(context); Number count = list.get(0).getValue("cnt"); return count == null ? 0 : count.intValue(); } else { log.warn("Unsupported loader type: {}", loader.getClass().getName()); return 0; } }