// Path: queryfy-mongodb/src/main/java/org/evcode/queryfy/mongodb/converter/DateTimeConverter.java
// public class DateTimeConverter implements TypeConverter {
// 
//     @Override
//     public boolean isSupported(Class<?> type) {
//         return type.isAssignableFrom(LocalDate.class) ||
//                 type.isAssignableFrom(LocalDateTime.class) ||
//                 type.isAssignableFrom(ZonedDateTime.class);
//     }
// 
//     @Override
//     public Object convert(Object value) {
//         if (value instanceof LocalDate) {
//             Date date = Date.from(((LocalDate) value).atStartOfDay(ZoneOffset.UTC).toInstant());
//             return date;
//         }
// 
//         if (value instanceof LocalDateTime) {
//             Date date = Date.from(((LocalDateTime) value).atZone(ZoneOffset.UTC).toInstant());
//             return date;
//         }
// 
//         if (value instanceof ZonedDateTime) {
//             Date date = Date.from(((ZonedDateTime) value).toInstant());
//             return date;
//         }
// 
//         return value;
//     }
// }
// 
// Path: queryfy-mongodb/src/main/java/org/evcode/queryfy/mongodb/converter/TypeConverter.java
// public interface TypeConverter {
// 
//     boolean isSupported(final Class<?> type);
// 
//     Object convert(Object value);
// }


import org.evcode.queryfy.mongodb.converter.DateTimeConverter;
import org.evcode.queryfy.mongodb.converter.TypeConverter;
import java.util.*;

        public Builder() {
        }

        public Builder withPath(String name) {
            return withPath(name, name);
        }

        public Builder withPath(String name, String path) {
            return withQueryPath(name, path).withProjectionPath(name, path);
        }

        public Builder withQueryPath(String name) {
            return withQueryPath(name, name);
        }

        public Builder withQueryPath(String name, String path) {
            queryPaths.put(name, path);
            return this;
        }

        public Builder withProjectionPath(String name) {
            return withProjectionPath(name, name);
        }

        public Builder withTypeConverter(TypeConverter converter) {
            typeConverters.add(converter);
            return this;
        }

// Path: queryfy-mongodb/src/main/java/org/evcode/queryfy/mongodb/converter/DateTimeConverter.java
// public class DateTimeConverter implements TypeConverter {
// 
//     @Override
//     public boolean isSupported(Class<?> type) {
//         return type.isAssignableFrom(LocalDate.class) ||
//                 type.isAssignableFrom(LocalDateTime.class) ||
//                 type.isAssignableFrom(ZonedDateTime.class);
//     }
// 
//     @Override
//     public Object convert(Object value) {
//         if (value instanceof LocalDate) {
//             Date date = Date.from(((LocalDate) value).atStartOfDay(ZoneOffset.UTC).toInstant());
//             return date;
//         }
// 
//         if (value instanceof LocalDateTime) {
//             Date date = Date.from(((LocalDateTime) value).atZone(ZoneOffset.UTC).toInstant());
//             return date;
//         }
// 
//         if (value instanceof ZonedDateTime) {
//             Date date = Date.from(((ZonedDateTime) value).toInstant());
//             return date;
//         }
// 
//         return value;
//     }
// }
// 
// Path: queryfy-mongodb/src/main/java/org/evcode/queryfy/mongodb/converter/TypeConverter.java
// public interface TypeConverter {
// 
//     boolean isSupported(final Class<?> type);
// 
//     Object convert(Object value);
// }


// Path: queryfy-mongodb/src/main/java/org/evcode/queryfy/mongodb/MongodbContext.java
import org.evcode.queryfy.mongodb.converter.DateTimeConverter;
import org.evcode.queryfy.mongodb.converter.TypeConverter;
import java.util.*;


        public Builder() {
        }

        public Builder withPath(String name) {
            return withPath(name, name);
        }

        public Builder withPath(String name, String path) {
            return withQueryPath(name, path).withProjectionPath(name, path);
        }

        public Builder withQueryPath(String name) {
            return withQueryPath(name, name);
        }

        public Builder withQueryPath(String name, String path) {
            queryPaths.put(name, path);
            return this;
        }

        public Builder withProjectionPath(String name) {
            return withProjectionPath(name, name);
        }

        public Builder withTypeConverter(TypeConverter converter) {
            typeConverters.add(converter);
            return this;
        }

        public Builder withNoTypeConverters() {