// Path: src/main/java/com/orientechnologies/spatial/strategy/SpatialQueryBuilderWithin.java
// public class SpatialQueryBuilderWithin extends SpatialQueryBuilderAbstract {
// 
//   public static final String NAME = "within";
// 
//   public SpatialQueryBuilderWithin(OLuceneSpatialIndexContainer manager, OShapeBuilder factory) {
//     super(manager, factory);
//   }
// 
//   @Override
//   public SpatialQueryContext build(Map<String, Object> query) throws Exception {
//     Shape shape = parseShape(query);
// 
//     SpatialStrategy strategy = manager.strategy();
//     if (isOnlyBB(strategy)) {
//       shape = shape.getBoundingBox();
//     }
//     SpatialArgs args = new SpatialArgs(SpatialOperation.IsWithin, shape);
//     Filter filter = strategy.makeFilter(args);
//     return new SpatialQueryContext(null, manager.searcher(), new MatchAllDocsQuery(), filter);
//   }
// 
//   @Override
//   public String getName() {
//     return NAME;
//   }
// }


import com.orientechnologies.orient.core.command.OCommandContext;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.sql.parser.OBinaryCompareOperator;
import com.orientechnologies.orient.core.sql.parser.OExpression;
import com.orientechnologies.orient.core.sql.parser.OFromClause;
import com.orientechnologies.spatial.strategy.SpatialQueryBuilderWithin;
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.SpatialRelation;
import java.util.Collection;
/*
 *
 *  * Copyright 2014 Orient Technologies.
 *  *
 *  * Licensed under the Apache License, Version 2.0 (the "License");
 *  * you may not use this file except in compliance with the License.
 *  * You may obtain a copy of the License at
 *  *
 *  *      http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS,
 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  * See the License for the specific language governing permissions and
 *  * limitations under the License.
 *  
 */

package com.orientechnologies.spatial.functions;



/**
 * Created by Enrico Risa on 12/08/15.
 */
public class OSTWithinFunction extends OSpatialFunctionAbstract {

  public static final String NAME = "st_within";

  public OSTWithinFunction() {
    super(NAME, 2, 2);
  }

  @Override
  public Object execute(Object iThis, OIdentifiable iCurrentRecord, Object iCurrentResult, Object[] iParams,
      OCommandContext iContext) {

    Shape shape = factory.fromObject(iParams[0]);

    Shape shape1 = factory.fromObject(iParams[1]);

    return shape.relate(shape1) == SpatialRelation.WITHIN;
  }

  @Override
  public String getSyntax() {
    return null;
  }

  @Override
  public Iterable<OIdentifiable> searchFromTarget(OFromClause target, OBinaryCompareOperator operator, Object rightValue,
      OCommandContext ctx, OExpression... args) {
    return results(target, args, ctx);
  }

  @Override
  public long estimate(OFromClause target, OBinaryCompareOperator operator, Object rightValue, OCommandContext ctx,
      OExpression... args) {

// Path: src/main/java/com/orientechnologies/spatial/strategy/SpatialQueryBuilderWithin.java
// public class SpatialQueryBuilderWithin extends SpatialQueryBuilderAbstract {
// 
//   public static final String NAME = "within";
// 
//   public SpatialQueryBuilderWithin(OLuceneSpatialIndexContainer manager, OShapeBuilder factory) {
//     super(manager, factory);
//   }
// 
//   @Override
//   public SpatialQueryContext build(Map<String, Object> query) throws Exception {
//     Shape shape = parseShape(query);
// 
//     SpatialStrategy strategy = manager.strategy();
//     if (isOnlyBB(strategy)) {
//       shape = shape.getBoundingBox();
//     }
//     SpatialArgs args = new SpatialArgs(SpatialOperation.IsWithin, shape);
//     Filter filter = strategy.makeFilter(args);
//     return new SpatialQueryContext(null, manager.searcher(), new MatchAllDocsQuery(), filter);
//   }
// 
//   @Override
//   public String getName() {
//     return NAME;
//   }
// }


// Path: src/main/java/com/orientechnologies/spatial/functions/OSTWithinFunction.java
import com.orientechnologies.orient.core.command.OCommandContext;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.sql.parser.OBinaryCompareOperator;
import com.orientechnologies.orient.core.sql.parser.OExpression;
import com.orientechnologies.orient.core.sql.parser.OFromClause;
import com.orientechnologies.spatial.strategy.SpatialQueryBuilderWithin;
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.SpatialRelation;
import java.util.Collection;

/*
 *
 *  * Copyright 2014 Orient Technologies.
 *  *
 *  * Licensed under the Apache License, Version 2.0 (the "License");
 *  * you may not use this file except in compliance with the License.
 *  * You may obtain a copy of the License at
 *  *
 *  *      http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS,
 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  * See the License for the specific language governing permissions and
 *  * limitations under the License.
 *  
 */

package com.orientechnologies.spatial.functions;



/**
 * Created by Enrico Risa on 12/08/15.
 */
public class OSTWithinFunction extends OSpatialFunctionAbstract {

  public static final String NAME = "st_within";

  public OSTWithinFunction() {
    super(NAME, 2, 2);
  }

  @Override
  public Object execute(Object iThis, OIdentifiable iCurrentRecord, Object iCurrentResult, Object[] iParams,
      OCommandContext iContext) {

    Shape shape = factory.fromObject(iParams[0]);

    Shape shape1 = factory.fromObject(iParams[1]);

    return shape.relate(shape1) == SpatialRelation.WITHIN;
  }

  @Override
  public String getSyntax() {
    return null;
  }

  @Override
  public Iterable<OIdentifiable> searchFromTarget(OFromClause target, OBinaryCompareOperator operator, Object rightValue,
      OCommandContext ctx, OExpression... args) {
    return results(target, args, ctx);
  }

  @Override
  public long estimate(OFromClause target, OBinaryCompareOperator operator, Object rightValue, OCommandContext ctx,
      OExpression... args) {

    Collection resultSet = results(target, args, ctx);