@Override
 public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
   IDataSource<?> ds = idx.getDataSource();
   IDataSourcePropertiesProvider dspp = ds.getPropertiesProvider();
   AbstractScanOperator as = (AbstractScanOperator) op;
   deliveredProperties = dspp.computePropertiesVector(as.getVariables());
 }
 @Override
 public PhysicalRequirements getRequiredPropertiesForChildren(
     ILogicalOperator op, IPhysicalPropertiesVector reqdByParent) {
   List<LogicalVariable> scanVariables = new ArrayList<>();
   scanVariables.addAll(primaryKeys);
   scanVariables.add(new LogicalVariable(-1));
   IPhysicalPropertiesVector physicalProps =
       dataSourceIndex
           .getDataSource()
           .getPropertiesProvider()
           .computePropertiesVector(scanVariables);
   List<ILocalStructuralProperty> localProperties = new ArrayList<>();
   List<OrderColumn> orderColumns = new ArrayList<OrderColumn>();
   // Data needs to be sorted based on the [token, number of token, PK]
   // OR [token, PK] if the index is not partitioned
   for (LogicalVariable skVar : secondaryKeys) {
     orderColumns.add(new OrderColumn(skVar, OrderKind.ASC));
   }
   for (LogicalVariable pkVar : primaryKeys) {
     orderColumns.add(new OrderColumn(pkVar, OrderKind.ASC));
   }
   localProperties.add(new LocalOrderProperty(orderColumns));
   StructuralPropertiesVector spv =
       new StructuralPropertiesVector(physicalProps.getPartitioningProperty(), localProperties);
   return new PhysicalRequirements(
       new IPhysicalPropertiesVector[] {spv},
       IPartitioningRequirementsCoordinator.NO_COORDINATION);
 }