package de.nava.mlsample.service.init; import com.marklogic.client.DatabaseClient; import com.marklogic.client.admin.QueryOptionsManager; import com.marklogic.client.io.Format; import com.marklogic.client.io.QueryOptionsListHandle; import com.marklogic.client.io.StringHandle; import com.marklogic.client.io.ValuesHandle; import com.marklogic.client.query.CountedDistinctValue; import com.marklogic.client.query.QueryManager; import com.marklogic.client.query.RawCombinedQueryDefinition; import com.marklogic.client.query.ValuesDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.FileCopyUtils; import java.io.FileReader; import java.io.IOException; import java.util.Map; /** * Initialize query options. * * TODO: will be soon obsolete when ml-gradle is fully integrated * * @author Niko Schmuck */ @Deprecated @Service public class BootstrapQueryOptionsPopulator implements InitializingBean { private static final Logger logger = LoggerFactory.getLogger(BootstrapQueryOptionsPopulator.class); @Autowired protected DatabaseClient databaseClient; @Autowired protected QueryManager queryManager; @Override public void afterPropertiesSet() throws Exception { logger.info("~~~ Initialize query options"); listExistingQueryOptions(); defineQueryOptions(); testQueryOptions(); } private void listExistingQueryOptions() { QueryOptionsListHandle qolHandle = new QueryOptionsListHandle(); queryManager.optionsList(qolHandle); for (Map.Entry<String, String> option : qolHandle.getValuesMap().entrySet()) { logger.info(" * Option {} -> {}", option.getKey(), option.getValue()); } } private void defineQueryOptions() throws IOException { QueryOptionsManager optionsMgr = databaseClient.newServerConfigManager().newQueryOptionsManager(); String xmlOptions = FileCopyUtils.copyToString( new FileReader("src/main/xqy/options/distinct-values.xml")); StringHandle writeHandle = new StringHandle(xmlOptions); RawCombinedQueryDefinition queryDef = queryManager.newRawCombinedQueryDefinitionAs(Format.XML, xmlOptions); // See Java Developer Guide (ch 3.11.2.2 "Install Query Options") optionsMgr.writeOptions("distinct-values", writeHandle); logger.info("Registered query options successfully."); } private void testQueryOptions() { ValuesDefinition vdef = queryManager.newValuesDefinition("category", "distinct-values"); ValuesHandle results = queryManager.values(vdef, new ValuesHandle()); logger.info("Execute sample query for retrieving distinct values for category"); logger.info("Results:"); for (CountedDistinctValue val : results.getValues()) { // Raw: <distinct-value frequency="40">book</distinct-value> logger.info(" * {} {}", val.get("string", String.class), val.getCount()); } } }