<!-- 
RSS generated by JIRA (9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66) at Thu Feb 08 08:51:22 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>MongoDB Jira</title>
    <link>https://jira.mongodb.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>9.7.1</version>
        <build-number>970001</build-number>
        <build-date>13-04-2023</build-date>
    </build-info>


<item>
            <title>[JAVA-33] convenience methods for constructing DBObject trees</title>
                <link>https://jira.mongodb.org/browse/JAVA-33</link>
                <project id="10006" key="JAVA">Java Driver</project>
                    <description>&lt;p&gt;Take some time to think about good ways to offer convenience methods for constructing DBObject trees. Obviously, literal JSON strings is one way,  but it doesn&apos;t allow the use of program variables.&lt;/p&gt;

&lt;p&gt;I offer this as an example:&lt;/p&gt;

&lt;p&gt;	static public class DBObjBuilder&lt;br/&gt;
	{&lt;br/&gt;
		final private LinkedList&amp;lt;DBObject&amp;gt; objStack;&lt;br/&gt;
		private DBObject top() &lt;/p&gt;
{ return objStack.getLast(); }
&lt;p&gt;		public DBObjBuilder()&lt;/p&gt;
		{
			this.objStack = new LinkedList&amp;lt;DBObject&amp;gt;();
		}
&lt;p&gt;		public DBObjBuilder push(DBObject obj)&lt;/p&gt;
		{
			this.objStack.addLast(obj);
			return this;
		}
&lt;p&gt;		public DBObjBuilder push()&lt;/p&gt;
		{
			return push(new BasicDBObject());
		}
&lt;p&gt;		public DBObjBuilder pop(String key)&lt;/p&gt;
		{
			DBObject last = objStack.removeLast();
			top().put(key, last);
			return this;
		}
&lt;p&gt;		public DBObjBuilder pop(String... keys)&lt;br/&gt;
		{&lt;br/&gt;
			int n = keys.length;&lt;br/&gt;
			DBObject[] objs = new DBObject&lt;span class=&quot;error&quot;&gt;&amp;#91;n&amp;#93;&lt;/span&gt;;&lt;br/&gt;
			for (int i = n; --i &amp;gt;= 0; )&lt;/p&gt;
			{
				objs[i] = objStack.removeLast();
			}&lt;br/&gt;
			DBObject _top = top();&lt;br/&gt;
			for (int i = 0; i &amp;lt; n; ++i)&lt;br/&gt;
			{
				_top.put(keys[i], objs[i]);
			}&lt;br/&gt;
			return this;&lt;br/&gt;
		}&lt;br/&gt;
		public DBObjBuilder wrap(String key)&lt;br/&gt;
		{
			DBObject last = objStack.removeLast();
			DBObject o = new BasicDBObject();
			o.put(key, last);
			return push(o);
		}&lt;br/&gt;
		public DBObjBuilder wrap(String... keys)&lt;br/&gt;
		{&lt;br/&gt;
			int n = keys.length;&lt;br/&gt;
			DBObject[] objs = new DBObject&lt;span class=&quot;error&quot;&gt;&amp;#91;n&amp;#93;&lt;/span&gt;;&lt;br/&gt;
			for (int i = n; --i &amp;gt;= 0; )&lt;br/&gt;
			{				objs[i] = objStack.removeLast();			}
&lt;p&gt;			DBObject o = new BasicDBObject();&lt;br/&gt;
			for (int i = 0; i &amp;lt; n; ++i)&lt;/p&gt;
			{
				o.put(keys[i], objs[i]);
			}
&lt;p&gt;			return push(o);&lt;br/&gt;
		}&lt;br/&gt;
		public DBObjBuilder set(String key, Object value)&lt;/p&gt;
		{
			top().put(key, value);
			return this;
		}
&lt;p&gt;		public DBObjBuilder setList(String key, Object... values)&lt;br/&gt;
		{&lt;br/&gt;
			BasicDBList l = new BasicDBList();&lt;br/&gt;
			for (Object value : values)&lt;/p&gt;
			{
				l.add(value);
			}
&lt;p&gt;			top().put(key, l);&lt;br/&gt;
			return this;&lt;br/&gt;
		}&lt;br/&gt;
		public DBObject get()&lt;/p&gt;
		{
			return top();
		}
&lt;p&gt;	}&lt;/p&gt;

&lt;p&gt;This is somewhat like an RPN calculator for constructing DBObjects.&lt;br/&gt;
use case:&lt;/p&gt;

&lt;p&gt;		DBObjBuilder msetBuilder = new DBObjBuilder();&lt;br/&gt;
		DBObject mset = msetBuilder.push().set(&quot;foo&quot;,1).set(&quot;bar&quot;,&quot;cleveland&quot;).setList(&quot;baz&quot;,3,&quot;Wombat&quot;,44)&lt;br/&gt;
			.wrap(&quot;metadata&quot;)&lt;br/&gt;
			.wrap(&quot;$set&quot;)&lt;br/&gt;
			.get();&lt;/p&gt;

&lt;p&gt;This creates the equivalent to JSON object {&quot;$set&quot;: {&quot;metadata&quot;: &lt;/p&gt;
{&quot;foo&quot;: 1, &quot;bar&quot;: &quot;cleveland&quot;, &quot;baz&quot;, [3, &quot;Wombat&quot;, 44]}
&lt;p&gt;}}&lt;/p&gt;

&lt;p&gt;(running commentary: push() creates a new object on the stack; set() and setList() set a bunch of fields; wrap() pops the top object and sets a value of a new object that gets pushed on the top of the stack; get() returns the top object on the stack)&lt;/p&gt;</description>
                <environment></environment>
        <key id="10559">JAVA-33</key>
            <summary>convenience methods for constructing DBObject trees</summary>
                <type id="2" iconUrl="https://jira.mongodb.org/secure/viewavatar?size=xsmall&amp;avatarId=14711&amp;avatarType=issuetype">New Feature</type>
                                            <priority id="3" iconUrl="https://jira.mongodb.org/images/icons/priorities/major.svg">Major - P3</priority>
                        <status id="6" iconUrl="https://jira.mongodb.org/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="9">Done</resolution>
                                        <assignee username="eliot">Eliot Horowitz</assignee>
                                    <reporter username="jmsachs">Jason Sachs</reporter>
                        <labels>
                    </labels>
                <created>Fri, 4 Sep 2009 12:40:44 +0000</created>
                <updated>Fri, 2 Oct 2009 11:38:55 +0000</updated>
                            <resolved>Sat, 12 Sep 2009 11:27:42 +0000</resolved>
                                                    <fixVersion>0.10</fixVersion>
                                                        <votes>0</votes>
                                    <watches>0</watches>
                                                                                                                <comments>
                            <comment id="10720" author="eliot" created="Sat, 12 Sep 2009 11:27:42 +0000"  >&lt;p&gt;    @Test(groups = &lt;/p&gt;
{&quot;basic&quot;}
&lt;p&gt;)&lt;br/&gt;
    public void testDown1(){&lt;br/&gt;
        BasicDBObjectBuilder b = BasicDBObjectBuilder.start();&lt;br/&gt;
        b.append( &quot;x&quot; , 1 );&lt;br/&gt;
        b.push(&quot;y&quot;);&lt;br/&gt;
        b.append( &quot;a&quot; , 2 );&lt;br/&gt;
        b.pop();&lt;br/&gt;
        b.push( &quot;z&quot; );&lt;br/&gt;
        b.append( &quot;b&quot; , 3 );&lt;/p&gt;


&lt;p&gt;        DBObject x = b.get();&lt;br/&gt;
        DBObject y = JSON.parse( &quot;{ &apos;x&apos; : 1 , &apos;y&apos; : &lt;/p&gt;
{ &apos;a&apos; : 2 }
&lt;p&gt; , &apos;z&apos; : &lt;/p&gt;
{ &apos;b&apos; : 3 }
&lt;p&gt; }&quot; );&lt;/p&gt;

&lt;p&gt;        assert( x.equals( y ) );&lt;br/&gt;
    }&lt;/p&gt;</comment>
                            <comment id="10640" author="jmsachs" created="Fri, 4 Sep 2009 12:44:01 +0000"  >&lt;p&gt;(I did see BasicDBObjectBuilder, but it doesn&apos;t really add much functionality)&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_15850" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_12550" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2|hrhdmf:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10558" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>15007</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </customfields>
    </item>
</channel>
</rss>