use of org.haiku.haikudepotserver.pkg.FixedPkgLocalizationLookupServiceImpl in project haikudepotserver by haiku.
the class PkgApiImpl method searchPkgs.
@Override
public SearchPkgsResult searchPkgs(final SearchPkgsRequest request) {
Preconditions.checkNotNull(request);
Preconditions.checkState(null != request.architectureCodes && !request.architectureCodes.isEmpty(), "architecture codes must be supplied and at least one is required");
Preconditions.checkState(null != request.repositoryCodes && !request.repositoryCodes.isEmpty(), "repository codes must be supplied and at least one is required");
Preconditions.checkState(!Strings.isNullOrEmpty(request.naturalLanguageCode));
Preconditions.checkNotNull(request.limit);
Preconditions.checkState(request.limit > 0);
if (null == request.sortOrdering) {
request.sortOrdering = SearchPkgsRequest.SortOrdering.NAME;
}
final ObjectContext context = serverRuntime.newContext();
final NaturalLanguage naturalLanguage = getNaturalLanguage(context, request.naturalLanguageCode);
PkgSearchSpecification specification = new PkgSearchSpecification();
String exp = request.expression;
if (null != exp) {
exp = Strings.emptyToNull(exp.trim().toLowerCase());
}
specification.setExpression(exp);
if (null != request.pkgCategoryCode) {
specification.setPkgCategory(PkgCategory.getByCode(context, request.pkgCategoryCode).get());
}
if (null != request.expressionType) {
specification.setExpressionType(PkgSearchSpecification.ExpressionType.valueOf(request.expressionType.name()));
}
specification.setNaturalLanguage(getNaturalLanguage(context, request.naturalLanguageCode));
specification.setDaysSinceLatestVersion(request.daysSinceLatestVersion);
specification.setSortOrdering(PkgSearchSpecification.SortOrdering.valueOf(request.sortOrdering.name()));
specification.setArchitectures(transformCodesToArchitectures(context, request.architectureCodes));
specification.setRepositories(transformCodesToRepositories(context, request.repositoryCodes));
specification.setLimit(request.limit);
specification.setOffset(request.offset);
SearchPkgsResult result = new SearchPkgsResult();
// if there are more than we asked for then there must be more available.
result.total = pkgService.total(context, specification);
result.items = Collections.emptyList();
if (result.total > 0) {
List<PkgVersion> searchedPkgVersions = pkgService.search(context, specification);
// if there is a pattern then it is not possible to use the fixed lookup (which
// is faster).
final PkgLocalizationLookupService localPkgLocalizationLookupService = null != specification.getExpressionAsPattern() ? pkgLocalizationService : new FixedPkgLocalizationLookupServiceImpl(context, searchedPkgVersions, naturalLanguage);
result.items = searchedPkgVersions.stream().map(spv -> {
Optional<PkgUserRatingAggregate> pkgUserRatingAggregateOptional = PkgUserRatingAggregate.getByPkgAndRepository(context, spv.getPkg(), spv.getRepositorySource().getRepository());
SearchPkgsResult.Pkg resultPkg = new SearchPkgsResult.Pkg();
resultPkg.name = spv.getPkg().getName();
resultPkg.modifyTimestamp = spv.getPkg().getModifyTimestamp().getTime();
resultPkg.derivedRating = pkgUserRatingAggregateOptional.map(_PkgUserRatingAggregate::getDerivedRating).orElse(null);
resultPkg.hasAnyPkgIcons = !PkgIconImage.findForPkg(context, spv.getPkg()).isEmpty();
ResolvedPkgVersionLocalization resolvedPkgVersionLocalization = localPkgLocalizationLookupService.resolvePkgVersionLocalization(context, spv, specification.getExpressionAsPattern(), naturalLanguage);
SearchPkgsResult.PkgVersion resultVersion = new SearchPkgsResult.PkgVersion();
resultVersion.major = spv.getMajor();
resultVersion.minor = spv.getMinor();
resultVersion.micro = spv.getMicro();
resultVersion.preRelease = spv.getPreRelease();
resultVersion.revision = spv.getRevision();
resultVersion.createTimestamp = spv.getCreateTimestamp().getTime();
resultVersion.viewCounter = spv.getViewCounter();
resultVersion.architectureCode = spv.getArchitecture().getCode();
resultVersion.payloadLength = spv.getPayloadLength();
resultVersion.title = resolvedPkgVersionLocalization.getTitle();
resultVersion.summary = resolvedPkgVersionLocalization.getSummary();
resultVersion.repositorySourceCode = spv.getRepositorySource().getCode();
resultVersion.repositoryCode = spv.getRepositorySource().getRepository().getCode();
if (null != request.expressionType && StringUtils.isNotBlank(request.expression) && Stream.of(resolvedPkgVersionLocalization.getTitle(), resolvedPkgVersionLocalization.getSummary()).noneMatch(s -> StringUtils.containsIgnoreCase(StringUtils.trimToEmpty(s), StringUtils.trimToEmpty(request.expression)))) {
resultVersion.descriptionSnippet = StringHelper.tryCreateTextSnippetAroundFoundText(resolvedPkgVersionLocalization.getDescription(), request.expression, SNIPPET_LENGTH).orElse(null);
}
resultPkg.versions = Collections.singletonList(resultVersion);
return resultPkg;
}).collect(Collectors.toList());
}
LOGGER.info("search for pkgs found {} results", result.items.size());
return result;
}
use of org.haiku.haikudepotserver.pkg.FixedPkgLocalizationLookupServiceImpl in project haikudepotserver by haiku.
the class HomeController method home.
/**
* <p>This is the entry point for the home page. It will look at the parameters supplied and will
* establish what should be displayed.</p>
*/
@RequestMapping(method = RequestMethod.GET)
public ModelAndView home(HttpServletRequest httpServletRequest, @RequestParam(value = KEY_OFFSET, defaultValue = "0") Integer offset, @RequestParam(value = KEY_REPOSITORIESCODES, required = false) String repositoryCodes, @RequestParam(value = KEY_ARCHITECTURECODE, required = false) String architectureCode, @RequestParam(value = KEY_PKGCATEGORYCODE, required = false) String pkgCategoryCode, @RequestParam(value = KEY_SEARCHEXPRESSION, required = false) String searchExpression, @RequestParam(value = KEY_VIEWCRITERIATYPECODE, required = false) ViewCriteriaType viewCriteriaType) {
ObjectContext context = serverRuntime.newContext();
if (Strings.isNullOrEmpty(architectureCode)) {
architectureCode = defaultArchitectureCode;
}
if (null == repositoryCodes) {
repositoryCodes = Repository.CODE_DEFAULT;
}
// ------------------------------
// FETCH THE DATA
PkgSearchSpecification searchSpecification = new PkgSearchSpecification();
searchSpecification.setOffset(offset);
searchSpecification.setLimit(PAGESIZE);
searchSpecification.setExpression(searchExpression);
searchSpecification.setExpressionType(AbstractSearchSpecification.ExpressionType.CONTAINS);
Repository repository = StringUtils.isBlank(repositoryCodes) ? null : Repository.getByCode(context, repositoryCodes);
searchSpecification.setRepositories(null == repository ? Repository.getAllActive(context) : Collections.singletonList(repository));
Architecture architecture = Architecture.getByCode(context, architectureCode);
searchSpecification.setArchitectures(ImmutableList.of(architecture, Architecture.getByCode(context, Architecture.CODE_ANY)));
Optional<PkgCategory> pkgCategoryOptional = Optional.empty();
if (null != pkgCategoryCode) {
pkgCategoryOptional = PkgCategory.getByCode(context, pkgCategoryCode);
}
NaturalLanguage naturalLanguage = NaturalLanguageWebHelper.deriveNaturalLanguage(context, httpServletRequest);
searchSpecification.setNaturalLanguage(naturalLanguage);
switch(null == viewCriteriaType ? ViewCriteriaType.FEATURED : viewCriteriaType) {
case FEATURED:
searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.PROMINENCE);
break;
case CATEGORIES:
searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.NAME);
searchSpecification.setPkgCategory(pkgCategoryOptional.orElseThrow(() -> new IllegalStateException("the pkg category code was unable to be found; " + pkgCategoryCode)));
break;
case ALL:
searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.NAME);
break;
case MOSTVIEWED:
searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.VERSIONVIEWCOUNTER);
break;
case MOSTRECENT:
searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.VERSIONCREATETIMESTAMP);
break;
default:
throw new IllegalStateException("unhandled view criteria type");
}
Long totalPkgVersions = pkgService.total(context, searchSpecification);
if (searchSpecification.getOffset() > totalPkgVersions) {
searchSpecification.setOffset(totalPkgVersions.intValue());
}
List<PkgVersion> pkgVersions = pkgService.search(context, searchSpecification);
// ------------------------------
// GENERATE OUTPUT
HomeData data = new HomeData();
data.setNaturalLanguage(naturalLanguage);
final Set<String> excludedArchitectureCode = ImmutableSet.of(Architecture.CODE_ANY, Architecture.CODE_SOURCE);
data.setAllArchitectures(Architecture.getAll(context).stream().filter(a -> !excludedArchitectureCode.contains(a.getCode())).collect(Collectors.toList()));
data.setArchitecture(architecture);
data.setRepository(repository);
data.setAllRepositories(Repository.getAllActive(context));
data.setAllPkgCategories(PkgCategory.getAll(context));
data.setPkgCategory(pkgCategoryOptional.orElseGet(() -> PkgCategory.getAll(context).get(0)));
data.setAllViewCriteriaTypes(ImmutableList.copyOf(ViewCriteriaType.values()));
data.setViewCriteriaType(viewCriteriaType);
data.setSearchExpression(searchExpression);
data.setPkgVersions(pkgVersions);
if (0 != totalPkgVersions.intValue()) {
data.setPagination(new Pagination(totalPkgVersions.intValue(), offset, PAGESIZE));
}
httpServletRequest.setAttribute(MultipageConstants.KEY_PKGLOCALIZATIONLOOKUPSERVICE, new FixedPkgLocalizationLookupServiceImpl(context, pkgVersions, naturalLanguage));
httpServletRequest.setAttribute(MultipageConstants.KEY_SERVERRUNTIME, serverRuntime);
ModelAndView result = new ModelAndView("multipage/home");
result.addObject("data", data);
return result;
}
use of org.haiku.haikudepotserver.pkg.FixedPkgLocalizationLookupServiceImpl in project haikudepotserver by haiku.
the class PkgDumpExportJobRunner method writePkgVersions.
private void writePkgVersions(JsonGenerator jsonGenerator, ObjectContext context, List<PkgVersion> pkgVersions, RepositorySource repositorySource, NaturalLanguage naturalLanguage) {
final PkgLocalizationLookupService pkgLocalizationLookupService = new FixedPkgLocalizationLookupServiceImpl(context, pkgVersions, naturalLanguage);
Map<String, List<PkgVersion>> pkgVersionsUnderCommonPkg = pkgVersions.stream().collect(Collectors.groupingBy((pv) -> pv.getPkg().getName()));
pkgVersionsUnderCommonPkg.values().forEach((pvs) -> {
try {
objectMapper.writeValue(jsonGenerator, createDumpPkg(context, pvs, repositorySource, naturalLanguage, pkgLocalizationLookupService));
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
});
}
Aggregations