/** * Mad-Advertisement * Copyright (C) 2011 Thorsten Marx <thmarx@gmx.net> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package net.mad.ads.db.condition.impl; import org.apache.lucene.document.Document; import org.apache.lucene.search.BooleanQuery; import com.google.common.base.Predicate; import com.javadocmd.simplelatlng.LatLng; import com.javadocmd.simplelatlng.LatLngTool; import com.javadocmd.simplelatlng.util.LengthUnit; import net.mad.ads.db.condition.Condition; import net.mad.ads.db.condition.Filter; import net.mad.ads.db.db.request.AdRequest; import net.mad.ads.db.definition.BannerDefinition; import net.mad.ads.db.definition.condition.DistanceConditionDefinition; import net.mad.ads.db.enums.ConditionDefinitions; /** * Condition zum Filtern von Bannern, die nur in einem bestimmten Radius um * eine Geo-Koordinate angezeigt werden sollen * * @author tmarx * */ public class DistanceCondition implements Condition, Filter { @Override public Predicate<BannerDefinition> getFilterPredicate(final AdRequest request) { Predicate<BannerDefinition> predicate = new Predicate<BannerDefinition>() { @Override public boolean apply(BannerDefinition type) { if (!type.hasConditionDefinition(ConditionDefinitions.DISTANCE)) { return true; } DistanceConditionDefinition dcdef = (DistanceConditionDefinition) type.getConditionDefinition(ConditionDefinitions.DISTANCE); if (request.getGeoLocation() == null) { /* * Der Request liefert keine Position, dann wird das Banner ebenfalls angezeigt * * TODO: evtl. könnte man das noch über einen Parameter steuern */ return true; } /* * Positionen für Banner und Request */ LatLng bannerPOS = new LatLng(dcdef.getGeoLocation().getLatitude(), dcdef.getGeoLocation().getLongitude()); LatLng requestPOS = new LatLng(request.getGeoLocation().getLatitude(), request.getGeoLocation().getLongitude()); /* * Distance zwischen Banner und Request */ double distance = LatLngTool.distance(bannerPOS, requestPOS, LengthUnit.KILOMETER); /* * Wird der Banner angegebene Radius nicht überschritten, wird das Banner angezeigt, ansonsten nicht */ if (dcdef.getGeoRadius() >= distance) { return true; } return false; } }; return predicate; } @Override public void addQuery(AdRequest request, BooleanQuery mainQuery) { // aktuell wird kein Radius Query unterstützt } @Override public void addFields(Document bannerDoc, BannerDefinition bannerDefinition) { // aktuell wird kein Radius Query unterstützt } }