+};
+
+static int solr_write_range(void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ struct solr_attr *solr_attr_left,
+ struct solr_attr *solr_attr_right)
+{
+ pr(solr_attr_left->index, client_data);
+ pr(":", client_data);
+ pr(solr_attr_left->begin, client_data);
+ pr(solr_attr_left->term, client_data);
+ pr(" TO ", client_data);
+ pr(solr_attr_right->term, client_data);
+ pr(solr_attr_right->close, client_data);
+ return 0;
+};
+
+static int solr_write_structure(void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ struct solr_attr *solr_attr)
+{
+ if (solr_attr->index) {
+ pr(solr_attr->index, client_data);
+ pr(":", client_data);
+ }
+ if (solr_attr->is_range) {
+ pr(solr_attr->begin, client_data);
+ pr(solr_attr->term, client_data);
+ pr(solr_attr->close, client_data);
+ }
+ else if (solr_attr->term)
+ pr(solr_attr->term, client_data);
+ return 0;
+};
+
+
+
+static int solr_write_and_or_range(void (*pr)(const char *buf, void *client_data),
+ void *client_data,
+ struct solr_attr *solr_attr_left,
+ struct solr_attr *solr_attr_right)
+{
+ if (solr_attr_left->is_range &&
+ solr_attr_right->is_range &&
+ !strcmp(solr_attr_left->index, solr_attr_right->index))
+ {
+ if (solr_attr_left->is_range > 3 && solr_attr_right->is_range < 3)
+ return solr_write_range(pr, client_data, solr_attr_left, solr_attr_right);
+ else if (solr_attr_left->is_range < 3 && solr_attr_right->is_range > 3)
+ return solr_write_range(pr, client_data, solr_attr_right, solr_attr_left);
+ }
+ solr_write_structure(pr, client_data, solr_attr_left);
+ pr(" AND ", client_data);
+ solr_write_structure(pr, client_data, solr_attr_right);
+ return 0;
+}
+
+static void solr_attr_init(struct solr_attr *solr_attr) {
+ solr_attr->index = 0;
+ solr_attr->relation = 0;
+ solr_attr->is_range = 0;
+ solr_attr->term = 0;